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

Posted

技术标签:

【中文标题】Plotly:如何从单条迹线制作堆积条形图?【英文标题】:Plotly: How to make stacked bar chart from single trace? 【发布时间】:2019-08-09 22:09:36 【问题描述】:

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

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

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


在情节方面,trace 用于描述 graph object,例如 ScatterBar,如下面的 sn-p 所示。

片段 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()

如果您查看上面的 sn-p,您会看到 that 是一个条形图,其中包含 go.Bar(x=['CategoryA',... 形式的单个跟踪。

情节 1.1:

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

情节 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。所以我想说一个跟踪包含或“显示”一个绘图对象而不是把它们称为相同的东西更正确。如果您想指定其他名称,可以使用例如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: 添加命名轨迹

如果您想“取消堆叠”条形,只需将 barmode 更改为 'group',如下所示:

fig.update_layout(barmode='group'),

情节 5:

【讨论】:

以上是关于Plotly:如何从单条迹线制作堆积条形图?的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何重命名 plotly express 堆积条形图的图例元素?

如何更改使用 Plotly Express 创建的堆积条形图的文本方向?

Plotly中的双轴堆积条形图

Plotly:仅在特定子图中堆积条形图

按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图

spss如何删除堆积条形图中的某块数据