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

如何按occupation_rank排序绘制职业频率分布直方图?

问题分析与解决方案

你的代码存在两个核心问题,导致无法实现按occupation_rank排序的职业频率展示:

  1. 使用sort_index()是按职业名称的字典序排序,并非你定义的自定义occupation_rank顺序
  2. 对离散职业类别使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:13:27