如何用Pandas按自定义顺序创建教育水平的直方图?
解决分类变量自定义顺序的直方图/条形图问题
我懂你的困扰——用数值映射会丢失原分类标签,直接用value_counts绘图又没法按想要的顺序排列对吧?其实最省心的办法是把edu转换成有序分类类型,这样不管做条形图(分类变量更适合用这个)还是直方图,都能严格遵循你想要的顺序,还能完整保留原标签。
下面给你分步演示可行的方案:
步骤1:将edu转为有序分类
先定义好你需要的自定义顺序列表,再用pd.Categorical把变量转换成有序分类,让Pandas和绘图库都能识别这个顺序:
import pandas as pd import matplotlib.pyplot as plt # 假设你的数据框是profile custom_order = ['10', '11', '12', 'GED', '13'] profile['edu'] = pd.Categorical(profile['edu'], categories=custom_order, ordered=True)
步骤2:绘制符合顺序的条形图(推荐用于分类变量)
对于分类数据来说,条形图比直方图更贴合场景,现在直接用value_counts()配合plot.bar(),就能自动按你设定的顺序排列:
profile['edu'].value_counts().plot(kind='bar', title='教育水平分布') plt.xlabel('教育水平') plt.ylabel('人数') plt.show()
这样出来的图x轴会严格按照10→11→12→GED→13的顺序显示,标签也是原分类值,完美解决你之前的两个问题。
如果你一定要用直方图(补充方案)
可以借助seaborn的histplot,它支持分类变量,并且能识别有序分类的顺序,也可以直接指定order参数:
import seaborn as sns sns.histplot(data=profile, x='edu', order=custom_order) plt.title('教育水平分布') plt.show()
另外补充你之前尝试的第一种方法的优化:如果已经把edu映射成数值型edunum,也可以手动修改x轴标签来还原原分类:
# 先做好映射:10→0, 11→1, 12→2, GED→3, 13→4 profile['edunum'] = profile['edu'].map({'10':0, '11':1, '12':2, 'GED':3, '13':4}) ax = profile['edunum'].hist() # 手动设置刻度和对应标签 ax.set_xticks([0,1,2,3,4]) ax.set_xticklabels(custom_order) plt.xlabel('教育水平') plt.show()
不过这种方法需要手动对应映射关系,不如直接用有序分类来得省心。
内容的提问来源于stack exchange,提问作者As3adTintin
相关产品推荐
相关产品推荐

