You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plotly中实现分组多值柱状图的数值排序?

问题:Plotly Express柱状图实现日期分组内按数值排序

我有一个包含date、system、number三列的DataFrame,使用Plotly Express绘制柱状图时,图表默认按system名称排序,无法实现每个日期分组内按number数值从小到大排序。

原代码如下:

import pandas as pd
import numpy as np

data = [('2022-10-01','Pay1',644), ('2022-10-01','Pay2',1460), ('2022-10-01','Pay3',1221), ('2022-10-01','Pay4',1623),\
 ('2022-10-01','Pay5',1904), ('2022-10-01','Pay6',1853), ('2022-10-01','Pay7',1826), ('2022-10-01','Pay8',247),\
 ('2022-10-01','Pay9',713), ('2022-10-01','Pay10',1159), ('2022-10-02','Pay1',755), ('2022-10-02','Pay2',786),\
 ('2022-10-02','Pay3',623), ('2022-10-02','Pay4',1766), ('2022-10-02','Pay5',1141), ('2022-10-02','Pay6',362),\
    ('2022-10-02','Pay7',1097), ('2022-10-02','Pay8',655), ('2022-10-02','Pay9',1569), ('2022-10-02','Pay10',796)]

data = pd.DataFrame(data,columns=['date','system','number'])

import plotly.express as px
fig = px.bar(data, x='date', y='number', 
            color='system')
fig.show()

当前效果:
当前柱状图效果

需求:每个日期分组内的柱状图按number数值从小到大排序。


解决方案

要实现分组内按数值排序,核心是给system列设置自定义有序分类,让Plotly按照分组内的数值顺序绘制柱子。具体实现代码如下:

import pandas as pd
import numpy as np
import plotly.express as px

data = [('2022-10-01','Pay1',644), ('2022-10-01','Pay2',1460), ('2022-10-01','Pay3',1221), ('2022-10-01','Pay4',1623),\
 ('2022-10-01','Pay5',1904), ('2022-10-01','Pay6',1853), ('2022-10-01','Pay7',1826), ('2022-10-01','Pay8',247),\
 ('2022-10-01','Pay9',713), ('2022-10-01','Pay10',1159), ('2022-10-02','Pay1',755), ('2022-10-02','Pay2',786),\
 ('2022-10-02','Pay3',623), ('2022-10-02','Pay4',1766), ('2022-10-02','Pay5',1141), ('2022-10-02','Pay6',362),\
    ('2022-10-02','Pay7',1097), ('2022-10-02','Pay8',655), ('2022-10-02','Pay9',1569), ('2022-10-02','Pay10',796)]

df = pd.DataFrame(data,columns=['date','system','number'])

# 生成每个日期分组内按number升序排列的system顺序
sorted_system_order = []
for single_date in df['date'].unique():
    # 筛选当前日期的数据,按number升序排序
    sorted_group = df[df['date'] == single_date].sort_values('number', ascending=True)
    # 将排序后的system加入全局顺序列表
    sorted_system_order.extend(sorted_group['system'].tolist())

# 将system列转为有序分类,指定自定义顺序
df['system'] = pd.Categorical(df['system'], categories=sorted_system_order, ordered=True)

# 绘制柱状图
fig = px.bar(df, x='date', y='number', color='system')
fig.show()

关键逻辑说明:

  • 遍历所有唯一日期,对每个日期分组内的数据按number升序排序,提取对应的system名称,生成全局的有序列表
  • 将system列转换为有序分类类型,Plotly会严格遵循这个分类顺序来排列柱子,从而实现每个日期分组内按number从小到大排序的效果

内容的提问来源于stack exchange,提问作者Roman Stasiuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:01:18