python - 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 版本,因为那里有很多东西更容易处理(图例、悬停属性等)。
解决方案
我能理解你的问题的唯一方法是你不想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()
推荐阅读
- php - 我可以从 Notification Laravel 的数据库中获取电子邮件数据吗?
- angular - 调用 3rd 方 api 时出现 403 错误
- angularjs - 无法使用 ng-init 调用 angularjs 函数
- xml - 使用 XSLT 基于 XML 中的子属性值删除重复的父标记
- css - Angular:如何使用查询参数过滤数据表
- jquery - 如何在jquery之前和之后为输入字段添加标签?
- kubernetes - prometheus-operator中如何监控外部服务
- typescript - 通过组合接口来创建一个带有区分字段的类型?
- selenium - Selenium/Rendering 问题,无法从输入字段读取文本
- java - 如何保存用户上次阅读的页码