如何阻止dataframe.boxplot()自动排序并按原序列显示列?
解决Pandas箱线图按自定义顺序显示分类标签的问题
问题原因
你用map转换后的Column列是字符串类型,pandas绘制箱线图时会默认按字符串字典序排序,而非你想要的原始数字对应的映射顺序(1→L5,2→L4…14→M4)。另外你代码里的sorted()没有实际作用,既没传入参数也没赋值给变量。
修复步骤
方法1:将分类列设为有序分类(推荐)
用pd.Categorical指定自定义顺序,后续对该列做分组、绘图等操作都会保持设定好的序列:
import pandas as pd # 定义和原始数字映射完全对应的标签顺序 custom_order = ['L5', 'L4', 'L3', 'L2', 'L1', 'M12', 'M11', 'M10', 'M9', 'M8', 'M7', 'M6', 'M5', 'M4'] # 映射标签并转为有序分类类型 df['Column'] = pd.Categorical( df['Column'].map({ 1: 'L5', 2:'L4', 3: 'L3', 4:'L2', 5:'L1', 6:'M12', 7:'M11', 8:'M10', 9:'M9', 10:'M8', 11:'M7', 12:'M6', 13:'M5', 14:'M4' }), categories=custom_order, ordered=True ) # 绘制箱线图 df.boxplot(column=['Time'], by=['Column'])
方法2:绘图时直接指定顺序
如果不想修改列的类型,可在boxplot中通过order参数强制指定展示序列:
# 完成标签映射 df['Column'] = df['Column'].map({ 1: 'L5', 2:'L4', 3: 'L3', 4:'L2', 5:'L1', 6:'M12', 7:'M11', 8:'M10', 9:'M9', 10:'M8', 11:'M7', 12:'M6', 13:'M5', 14:'M4' }) # 定义自定义顺序 custom_order = ['L5', 'L4', 'L3', 'L2', 'L1', 'M12', 'M11', 'M10', 'M9', 'M8', 'M7', 'M6', 'M5', 'M4'] # 绘图时传入order参数 df.boxplot(column=['Time'], by=['Column'], order=custom_order)
注意事项
- 你之前代码中的
sorted()属于无效代码,直接删除即可。 - 有序分类的方式更适合后续对该列的持续分析,能避免重复指定顺序的麻烦。
内容的提问来源于stack exchange,提问作者AD_1
相关产品推荐
相关产品推荐

