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

如何调整Pandas boxplot中星期几标签为周一至周日的顺序?

问题

使用pandas的boxplot(by="name_of_day")绘制箱线图时,横轴上的星期几标签顺序不符合需求,需要调整为周一至周日的排列。以下是可复现的示例代码:

import pandas as pd

# 创建DataFrame
df = (
    # 生成包含日期和销售额的两列数据
    pd.DataFrame({'date': pd.date_range(start='1/5/2022', freq='D', periods=15),
                   'sales': [6, 8, 9, 5, 4, 8, 8, 3, 5, 9, 8, 3, 4, 7, 7]})
    # 新增列提取星期名称
    .assign(name_of_day = lambda df: df.date.dt.day_name())
)

生成的DataFrame前3行如下:

date  sales name_of_day
0 2022-01-05      6    Wednesday
1 2022-01-06      8     Thursday
2 2022-01-07      9       Friday

执行绘图代码后,横轴标签顺序错误:

df.boxplot(by="name_of_day");

需要通过pandas原生的boxplot()或plot.box()方法调整顺序,不考虑seaborn方案。

解决方法

核心思路是让pandas明确识别星期几的排列顺序,以下两种方案均基于此实现:

方法1:将星期列转为有序分类(推荐)

把name_of_day设置为有序分类类型,指定周一到周日的固定顺序,后续绘图会自动遵循该顺序:

import pandas as pd

# 定义周一至周日的标准顺序
week_order = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

df = (
    pd.DataFrame({'date': pd.date_range(start='1/5/2022', freq='D', periods=15),
                   'sales': [6, 8, 9, 5, 4, 8, 8, 3, 5, 9, 8, 3, 4, 7, 7]})
    # 将星期名称转为有序分类
    .assign(name_of_day = lambda df: pd.Categorical(df.date.dt.day_name(), categories=week_order, ordered=True))
)

# 绘制箱线图,横轴将按指定顺序排列
df.boxplot(by="name_of_day");

方法2:调用boxplot时直接指定顺序

如果不想修改原DataFrame的列类型,可以在绘图时通过order参数直接定义横轴标签的排列顺序:

week_order = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

# 筛选出当前数据中实际存在的星期几,避免空类别报错
present_days = [day for day in week_order if day in df['name_of_day'].unique()]

# 传入order参数指定顺序
df.boxplot(column='sales', by='name_of_day', order=present_days);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:41:26