首页 > 解决方案 > python / plotly(express)中的堆积条形图:条形的分组/排序

问题描述

我在数据框中有数据,我想用堆积条形图绘制:

test_df = pd.DataFrame([[1, 5, 1, 'A'], [2, 10, 1, 'B'], [3, 3, 1, 'A']], columns = ('ID', 'Value', 'Bucket', 'Type'))

如果我使用 Plotly Express 进行绘图,我会得到条形相互堆叠并正确排序(基于索引):

fig = px.bar(test_df, x='Bucket', y='Value', barmode='stack')

但是,我想根据类型为数据着色,因此我选择

fig = px.bar(test_df, x='Bucket', y='Value', barmode='stack', color='Type')

在此处输入图像描述

这行得通,但现在排序混乱了,因为现在所有条形图都按类型分组。我查看了 Plotly Express 的文档,找不到独立指定条形排序的方法。关于如何做到这一点的任何提示?

我在这里找到了这个,但情况有点不同,那里提到的选项似乎对我没有帮助: 如何禁用基于颜色的分组条的情节表达?

编辑:这进入了正确的方向,但不是使用 Plotly Express,而是使用 Plotly graph_objects:

import plotly.graph_objects as go
test_df = pd.DataFrame([[1, 5, 1, 'A', 'red'], [2, 10, 1, 'B', 'blue'], [3, 3, 1, 'A', 'red']], columns = ('ID', 'Value', 'Bucket', 'Type', 'Color'))
fig = go.Figure()
fig.add_trace(go.Bar(x=test_df["Bucket"], y=test_df["Value"], marker_color=test_df["Color"]))

输出: 在此处输入图像描述

不过,我更喜欢 Express 版本,因为那里有很多东西更容易处理(图例、悬停属性等)。

标签: pythonplotly

解决方案


我能理解你的问题的唯一方法是你不想B被堆叠在上面A,而是相反。如果是这种情况,那么您可以通过以下方式获得您想要的东西:

fig.data = fig.data[::-1]
fig.layout.legend.traceorder = 'reversed'

在此处输入图像描述

一些细节:

fig.data = fig.data[::-1]只是颠倒了痕迹出现的顺序,fig.data并最终出现在绘制的图形本身中。然而,这也会颠倒图例的顺序。所以没有fig.layout.legend.traceorder = 'reversed'结果将是:

在此处输入图像描述

因此,完整的解决方法如下所示:

fig.data = fig.data[::-1]
fig.layout.legend.traceorder = 'reversed'

完整代码:

import pandas as px
import plotly.express as px
test_df = pd.DataFrame([[1, 5, 1, 'A'], [2, 10, 1, 'B'], [3, 3, 1, 'A']], columns = ('ID', 'Value', 'Bucket', 'Type'))
fig = px.bar(test_df, x='Bucket', y='Value', barmode='stack', color='Type')
fig.data = fig.data[::-1]
fig.layout.legend.traceorder = 'reversed'
fig.show()

推荐阅读