如何调整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
相关产品推荐
相关产品推荐

