Plotly:如何从单条轨迹制作堆积条形图?

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

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

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

我想要一个字段堆叠条形图,旁边是按字段排列的问题堆叠条形图。

谢谢大家!

有关如何使用提供的特定数据集制作堆积条形图的示例,请查看 中的建议。以下答案解决了您如何无法 使用单条轨迹 制作堆积条形图。为了向您展示原因,我将从看似多余的细节开始。但希望最后一切都会清楚。


在情节方面,trace 用于描述 graph object,例如下面的代码片段中的 ScatterBar

代码段 1.1:

import plotly.graph_objs as go
fig = go.Figure(go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC'],
                       y=[20, 14, 23]))
fig.update_layout(template = 'plotly_dark').show()

如果您查看上面的代码片段,您会发现 是一个条形图,具有 go.Bar(x=['CategoryA',....[=46 形式的单条轨迹=]

情节 1.1:

现在,我们如何添加一些东西使其成为 stacked chart?如果您首先向 x 添加一个元素,例如 'CategoryD',那么 nothing 会发生。这有点有趣,因为您可能会期待一条错误消息。

绘图 1.2: 添加 x 值

代码段 1.2

import plotly.graph_objs as go
fig = go.Figure(go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
                       y=[20, 14, 23]))
fig.update_layout(template = 'plotly_dark').show()

但在 CategoryD 具有相应的 y 值之前没有任何反应,例如 15:

绘图 1.3: 添加了 x 和 y 值

到目前为止的结论:将值添加到 xy 将在 x 轴上添加另一个类别并在 y 轴上添加一个值。如您所见,stacked 还没有任何进展:

代码段 1.3:

import plotly.graph_objs as go
fig = go.Figure(go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
                       y=[20, 14, 23, 15]))
fig.update_layout(template = 'plotly_dark').show()

但是,如果您添加带有 barmode='stack' 的布局术语呢?


代码段 2:

import plotly.graph_objs as go

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

fig.update_layout(barmode='stack',
                  title = 'Stacked bar chart',
                  template = 'plotly_dark').show()

绘图 2: barmode='stack'

我能理解任何人希望这会将所有数据堆叠在一个跟踪中,但 plotly 并不是那样构建的。为了得到你需要的东西,你必须使用 fig.add_trace(go.Bar())simply fig.add_bar().

添加另一个跟踪

代码段 3:

import plotly.graph_objs as go
fig = go.Figure(go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
                       y=[20, 14, 23, 15]))
fig.add_bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
            y=[5, 14, 4, 20])
fig.update_layout(barmode='stack',
                  title = 'Stacked bar chart!',
                  template = 'plotly_dark').show()

绘图 3: 添加轨迹

请注意,go.Bar() 对象都没有分配任何名称,并且默认情况下将它们命名为 trace 0trace 1。所以我想更正确的说法是跟踪包含或 'shows' 绘图对象而不是称它们为同一事物。如果你想指定其他名称,你可以这样做,例如 name = 'segment 1' 像这样:

片段 4:

import plotly.graph_objs as go
fig = go.Figure(go.Bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
                       y=[20, 14, 23, 15],
                       name = 'segment 1'))
fig.add_bar(x=['CategoryA', 'CategoryB', 'CategoryC', 'CategoryD'],
            y=[5, 14, 4, 20],
            name = 'segment 2')
fig.update_layout(barmode='stack',
                  title = 'Stacked bar chart!',
                  template = 'plotly_dark').show()

绘图 4: 添加命名轨迹

如果你想 'unstack' 你的酒吧,只需将酒吧模式更改为 'group',如下所示:

fig.update_layout(barmode='group'),

地块 5: