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

如何基于Pandas DataFrame绘制按年龄组分的多折线图

没问题!我来一步步帮你实现这个折线图,从数据整理到绘图都讲得明明白白,哪怕是入门也能跟着做~

第一步:先对齐你的数据结构(模拟示例)

首先我先模拟一个和你描述一致的DataFrame,你可以对照自己的数据调整:

import pandas as pd

# 模拟你的数据:age列是年龄组,8个class列是对应阶层的占比
data = {
    'age': ['16-25', '26-32', '33-40', '41-50', '51+'],
    'class 1 %': [25, 20, 15, 10, 8],
    'class 2 %': [20, 22, 25, 28, 30],
    'class 3 %': [15, 18, 20, 22, 25],
    'class 4 %': [12, 12, 12, 10, 10],
    'class 5 %': [10, 10, 8, 8, 7],
    'class 6 %': [8, 7, 7, 7, 6],
    'class 7 %': [7, 8, 9, 10, 11],
    'class 8 %': [3, 3, 4, 5, 3]
}
df = pd.DataFrame(data)
第二步:把数据转成适合绘图的格式

关键是要把宽格式数据转成长格式——原来的8个class列是不同的阶层,我们需要把它们变成X轴的变量,所以用melt函数转换:

# 将宽格式转为长格式,每个年龄组+阶层的组合对应一行数据
df_melted = df.melt(id_vars='age', var_name='social_class', value_name='percentage')

# 从阶层名称中提取数字(比如从"class 1 %"得到1),作为X轴的刻度值
df_melted['class_num'] = df_melted['social_class'].str.extract('(\d+)').astype(int)

如果你的阶层列命名不是class X %(比如是阶层1占比),只需要调整str.extract的正则,比如还是用(\d+)就能提取数字。

第三步:用Matplotlib绘制基础折线图

这是最基础的绘图方式,适合理解每一步逻辑:

import matplotlib.pyplot as plt

# 创建画布,设置大小
plt.figure(figsize=(10, 6))

# 遍历每个年龄组,单独绘制折线
for age_group in df['age'].unique():
    # 筛选当前年龄组的数据
    group_data = df_melted[df_melted['age'] == age_group]
    # 按阶层数字排序,保证X轴是1到8的顺序
    group_data_sorted = group_data.sort_values('class_num')
    # 绘制折线,加上标记点更清晰
    plt.plot(group_data_sorted['class_num'], group_data_sorted['percentage'], marker='o', label=age_group)

# 设置图表细节
plt.xlabel('Social Class (1-8)')
plt.ylabel('Percentage (%)')
plt.title('Social Class Distribution by Age Group')
# 添加图例,标注每个折线对应的年龄组
plt.legend(title='Age Group')
# 强制X轴显示1到8的刻度
plt.xticks(range(1, 9))
# 添加浅色网格,方便读取数值
plt.grid(alpha=0.3)

# 显示图表
plt.show()
第四步(可选):用Seaborn更简洁地绘图

Seaborn会自动处理分组和排序,代码更简洁:

import seaborn as sns

plt.figure(figsize=(10, 6))
# 直接用lineplot,指定x、y、分组列hue
sns.lineplot(data=df_melted, x='class_num', y='percentage', hue='age', marker='o')

# 同样设置图表细节
plt.xlabel('Social Class (1-8)')
plt.ylabel('Percentage (%)')
plt.title('Social Class Distribution by Age Group')
plt.xticks(range(1, 9))
plt.grid(alpha=0.3)
plt.legend(title='Age Group')

plt.show()
关键注意点
  • 一定要确保X轴的阶层是按1到8排序的,否则折线会乱序,所以我们提取了class_num并排序
  • 如果你的原始数据中每行占比总和不是100%,可以先检查数据是否正确,不影响绘图但会影响分析结论
  • 可以调整marker的样式(比如s方块、^三角),或者折线的颜色,让图表更美观

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:52