如何按occupation_rank排序绘制职业频率分布直方图?
问题分析与解决方案
你的代码存在两个核心问题,导致无法实现按occupation_rank排序的职业频率展示:
- 使用
sort_index()是按职业名称的字典序排序,并非你定义的自定义occupation_rank顺序 - 对离散职业类别使用
hist()方法不合适——直方图是为连续数值分布设计的,这里应该用条形图来清晰展示不同职业的频率差异
修正步骤与代码
1. 关联频率数据与自定义排序规则
先将频率统计结果与occupation_rank映射,给每个职业添加对应的排序权重:
# 将频率Series转换为DataFrame,方便添加rank列 fd_occupation = fd_occupation.reset_index() fd_occupation.columns = ['occupation', 'frequency'] # 映射自定义rank值 fd_occupation['rank'] = fd_occupation['occupation'].map(occupation_rank)
2. 按自定义rank排序
根据新增的rank列对数据排序,确保顺序符合你的要求:
fd_occupation_sorted = fd_occupation.sort_values('rank').set_index('occupation')
3. 绘制条形图(替代直方图)
用pandas结合matplotlib绘制条形图,直观展示各职业的频率:
import matplotlib.pyplot as plt # 绘制条形图 ax = fd_occupation_sorted['frequency'].plot(kind='bar', figsize=(12, 6)) # 设置图表标签与标题 ax.set_title('职业频率分布(按自定义rank排序)') ax.set_xlabel('职业') ax.set_ylabel('频率') # 旋转x轴标签避免重叠 plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show()
完整可运行代码
import pandas as pd import matplotlib.pyplot as plt occupation_rank = { ' Adm-clerical': 5, ' Exec-managerial': 13, ' Handlers-cleaners': 2, ' Prof-specialty': 14, ' Other-service': 4, ' Sales': 9, ' Craft-repair': 8, ' Transport-moving': 7, ' Farming-fishing': 1, ' Machine-op-inspct': 6, ' Tech-support':10, ' Protective-serv': 11, ' Armed-Forces': 12, ' Priv-house-serv': 3 } # 生成职业频率分布 fd_occupation = pd.Series(pd.value_counts(adult_data.occupation)) # 关联自定义rank并排序 fd_occupation = fd_occupation.reset_index() fd_occupation.columns = ['occupation', 'frequency'] fd_occupation['rank'] = fd_occupation['occupation'].map(occupation_rank) fd_occupation_sorted = fd_occupation.sort_values('rank').set_index('occupation') # 绘制可视化图表 ax = fd_occupation_sorted['frequency'].plot(kind='bar', figsize=(12, 6)) ax.set_title('职业频率分布(按自定义rank排序)') ax.set_xlabel('职业') ax.set_ylabel('频率') plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show()
关键说明
- 为什么不用直方图?直方图用于展示连续数值的分布特征(如年龄区间分布),而职业是离散类别,条形图更适合对比不同类别的频率大小。
- 如果一定要用直方图(不推荐),可以将
rank作为x轴、频率作为y轴,但会丢失职业名称的语义信息,实用性极低。
内容的提问来源于stack exchange,提问作者NewToPython
相关产品推荐
相关产品推荐

