绘制预期寿命数据集图表遇问题:需添加死亡、地区及年份信息
你的代码问题出在这
- 直接绘制
Region列完全错误:这列是字符串类型,matplotlib会自动把它转成整数索引乱绘,完全不符合地区维度的展示逻辑 - 未对数据做地区+年份聚合:直接甩全量原始数据上去,线条和数据点堆在一起必然拥挤重叠
- 没引入死亡相关数据列,也没有合理的标注逻辑
调整后的代码(解决重叠+展示死亡数据)
下面的代码会按地区展示预期寿命和死亡数据的年度趋势,彻底避免文本拥挤问题:
import pandas as pd import matplotlib.pyplot as plt # 读取数据集 df = pd.read_csv("/kaggle/input/life-expectancy-who-updated/Life-Expectancy-Data-Updated.csv") # 按地区+年份聚合,计算预期寿命和死亡率的均值(用中位数也可以,看需求调整) agg_df = df.groupby(['Region', 'Year']).agg( avg_life_expectancy=('Life_expectancy', 'mean'), avg_adult_mortality=('Adult_Mortality', 'mean') # 假设死亡数据列是Adult_Mortality,不对的话换你数据集里的对应列名 ).reset_index() # 创建大尺寸画布,分两个子图分别展示指标,避免单图拥挤 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10)) # 第一个子图:绘制各地区预期寿命年度趋势 for region in agg_df['Region'].unique(): region_data = agg_df[agg_df['Region'] == region] ax1.plot(region_data['Year'], region_data['avg_life_expectancy'], label=region) ax1.set_title('各地区预期寿命年度变化') ax1.set_ylabel('平均预期寿命') # 把图例放在画布外部,避免遮挡图表内容 ax1.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # 第二个子图:绘制各地区死亡率年度趋势 for region in agg_df['Region'].unique(): region_data = agg_df[agg_df['Region'] == region] ax2.plot(region_data['Year'], region_data['avg_adult_mortality'], label=region) ax2.set_title('各地区成人死亡率年度变化') ax2.set_xlabel('年份') ax2.set_ylabel('平均成人死亡率') ax2.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # 自动调整子图间距,彻底避免文本重叠 plt.tight_layout() plt.show()
核心优化点
- 先聚合数据:把同地区同年份的数据合并成均值,避免原始数据杂乱堆叠
- 分图展示:用两个子图分开承载预期寿命和死亡数据,避免单图内线条过多拥挤
- 图例外置:将图例挪到画布右侧外部,彻底解决文本重叠问题
- 放大画布:设置更大的画布尺寸,提升整体可读性
如果想把两个指标放在同一张图(双Y轴对比),可以用这个版本:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv("/kaggle/input/life-expectancy-who-updated/Life-Expectancy-Data-Updated.csv") agg_df = df.groupby(['Region', 'Year']).agg( avg_life_expectancy=('Life_expectancy', 'mean'), avg_adult_mortality=('Adult_Mortality', 'mean') ).reset_index() fig, ax1 = plt.subplots(figsize=(12, 6)) # 左侧Y轴绘制预期寿命,用实线 for region in agg_df['Region'].unique(): region_data = agg_df[agg_df['Region'] == region] ax1.plot(region_data['Year'], region_data['avg_life_expectancy'], label=f'{region} 预期寿命') ax1.set_title('各地区预期寿命与死亡率年度趋势') ax1.set_xlabel('年份') ax1.set_ylabel('平均预期寿命') ax1.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # 右侧Y轴绘制死亡率,用虚线区分 ax2 = ax1.twinx() for region in agg_df['Region'].unique(): region_data = agg_df[agg_df['Region'] == region] ax2.plot(region_data['Year'], region_data['avg_adult_mortality'], linestyle='--', label=f'{region} 死亡率') ax2.set_ylabel('平均成人死亡率') ax2.legend(bbox_to_anchor=(1.05, 0.8), loc='upper left') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者What
相关产品推荐
相关产品推荐

