情节:如何从单个轨迹制作堆叠的条形图?

时间:2019-03-19 11:31:37

标签: python plotly

是否可以并排放置两个堆叠的条形图,每个条形图来自同一列?

这是我的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

我想要按字段排列的堆积条形图旁边的按问题排列的堆积条形图。

谢谢大家!

1 个答案:

答案 0 :(得分:2)

有关如何使用提供的特定数据集制作条形图的示例,请查看Plotly-Dash: Want two stacked bar charts side by side from single df column中的建议。以下答案说明了您如何不能使用 单条迹线 制作堆积的条形图。为了说明原因,我将从看起来像是多余的细节开始。但希望最后一切都会清楚。


用密语来说,trace是一个用来描述graph object的术语,例如ScatterBar,如下面的代码片段。

代码段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)

如果您查看上面的摘录,您会看到 是一个条形图,带有go.Bar(x=['CategoryA',...形式的单个迹线。

图1.1:

enter image description here

现在,我们如何添加一些内容使其成为stacked chart?如果您首先向x中添加元素,例如'CategoryD',则 不会发生。这有点有趣,因为您可能希望收到一条错误消息。

图1.2:添加了x值

enter image description here

但是在CategoryD具有与15类似的y值之前什么也没发生:

图1.3:添加了x和y值

到目前为止的结论:向xy添加值将在x轴上添加另一个类别,并在y轴上添加一个值。如您所见,stacked仍然没有得到

enter image description here

但是如果您使用barmode='stack'添加布局术语怎么办?


代码段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)

图2: barmode ='stack'

enter image description here

我可以理解有人希望它将所有数据堆叠在一个跟踪中,但是似乎并不是那样构建的。要获得所需的内容,您必须添加另一个跟踪或go.Bar()对象,如下所示:

代码段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)

图3:添加跟踪

enter image description here

请注意,两个go.Bar()对象均未分配任何名称,并且默认情况下将其分别命名为trace 0trace 1。因此,我想说一条轨迹包含或“显示”一个绘图对象而不是将它们称为同一对象是更正确的说法。如果您想指定其他名称,可以使用name = 'segment 1'这样指定:

代码段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)

图4:添加命名迹线

enter image description here

如果要“拆开”条形,只需将条形模式更改为“分组”,如下所示:

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

图5:

enter image description here