Plotly: How to make stacked bar chart from single trace?

无人久伴 提交于 2019-12-07 10:31:23

问题


Is it possible to have two stacked bar charts side by side each of them coming from a single column?

Here's my df:

Field       Issue

Police      Budget cuts
Research    Budget cuts
Police      Time consuming
Banking     Lack of support
Healthcare  Lack of support
Research    Bureaucracy
Healthcare  Bureaucracy
Banking     Budget cuts

I want a stacked bar chart of Field next to a stacked bar chart of issues by field.

Thanks guys!


回答1:


For an example on how to make a stacked bar chart with the specific dataset provided, take a look at the suggestion in Plotly-Dash: Want two stacked bar charts side by side from single df column. The following answer addresses how you can not make a stacked bar chart with a single trace. To show you why, I'll start with what may seem like redundant details. But hopefully everything will be clear in the end.


In plotly terms, trace is a term used to describe a graph object such as Scatter or Bar like in the snippet below.

Snippet 1:

import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)

data = [go.Bar(
            x=['CategoryA', 'CategoryB', 'CategoryC'],
            y=[20, 14, 23]
    )]

iplot(data)

If you look at the snippet above, you'll see that that is a bar chart with a single trace in the form of go.Bar(x=['CategoryA',....

Plot 1.1:

Now, how can we add something to make it a stacked chart? If you start out by adding an element to x like 'CategoryD', then nothing happens. And that's a bit interesting since you'd might expect an error message instead.

Plot 1.2: Added x value

But nothing happens before CategoryD has a corresponding y value like 15:

Plot 1.3: Added x and y value

Conclusion so far: Adding values to x and y will add another category on the x-axis and a value on the y-axis. As you can see, nothing is getting stacked here quite yet:

But what if you add a layout term with barmode='stack'?


Snippet 2:

import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)

data = [go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
               y=[20, 14, 23, 15])]

layout = go.Layout(barmode='stack', title = 'Stacked bar chart')

fig = go.Figure(data=data, layout=layout)
iplot(fig)

Plot 2: barmode='stack'

I can understand anyone hoping that this would stack all data within a single trace, but plotly just doesn't seem to be built that way. To get what you need, you'll have to add another trace or go.Bar() object like this:

Snippet 3:

import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)

data = [go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
               y=[20, 14, 23, 15]),

       go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
               y=[5, 14, 4, 20])]

layout = go.Layout(barmode='stack', title = 'Stacked bar chart')

fig = go.Figure(data=data, layout=layout)
iplot(fig)

Plot 3: Add trace

Notice that neither of the go.Bar() objects have had any name assigned to them, and that plotly by default names them trace 0 and trace 1. So I guess it's more correct to say that a trace contains or 'shows' a plotly graph object rather than calling them the same thing. If you'd like to specify other names, you can do so with, for example, name = 'segment 1' like this:

Snippet 4:

import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)

data = [go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
               y=[20, 14, 23, 15], name = 'segment 1'),

       go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
               y=[5, 14, 4, 20], name = "segment 2")]

layout = go.Layout(barmode='stack', title = 'Stacked bar chart')

fig = go.Figure(data=data, layout=layout)
iplot(fig)

Plot 4: Add named traces

If you'd like to 'unstack' your bars, just change barmode to 'group' like this:

layout = go.Layout(barmode='group', title = 'Stacked bar chart')

Plot 5:



来源:https://stackoverflow.com/questions/55240033/plotly-how-to-make-stacked-bar-chart-from-single-trace

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!