如何在Python中绘制男女两组独立图表?附现有代码求助
修正后的代码及问题说明
先梳理下你代码里的几个核心问题:
- 错误使用了
df(x="Age", y="Sex")这种语法,Pandas DataFrame不能这么调用,得先筛选出对应性别的数据 plt.plot更适合折线图,展示乘客年龄分布用直方图(plt.hist)或者柱状图会更直观- 标签设置有误,子图的
ylabel应该代表乘客数量,性别已经通过子图标题区分开了 - 泰坦尼克号的
Age字段存在缺失值,得先清理掉这些无效数据才能得到准确的统计结果
下面是修正后的完整代码,能正确生成男女两组独立的年龄分布图表:
import numpy as np import matplotlib.pyplot as plt import pandas as pd # 读取数据并清理Age缺失值 df = pd.read_csv("titanic.csv") df_clean = df.dropna(subset=["Age"]) # 移除Age为空的记录 # 分别筛选男女乘客的年龄数据 male_ages = df_clean[df_clean["Sex"] == "male"]["Age"] female_ages = df_clean[df_clean["Sex"] == "female"]["Age"] # 设置画布与子图布局 plt.figure(figsize=(12, 5)) # 第一个子图:男性乘客年龄分布 plt.subplot(1, 2, 1) plt.hist(male_ages, bins=10, color='purple', edgecolor='black') plt.xlabel('Age') plt.ylabel('Number of Passengers') plt.title('Male Passengers by Age') # 第二个子图:女性乘客年龄分布 plt.subplot(1, 2, 2) plt.hist(female_ages, bins=10, color='green', edgecolor='black') plt.xlabel('Age') plt.ylabel('Number of Passengers') plt.title('Female Passengers by Age') # 调整子图间距,避免标签重叠 plt.tight_layout() plt.show()
额外扩展:
如果想要更规整的年龄分组(比如按10岁区间划分),可以手动定义分组区间,比如bins=[0,10,20,30,40,50,60,70,80]替换代码里的bins=10即可。
要是你确实想用折线图展示年龄分组后的人数趋势,可以先统计分组人数再绘图:
# 示例:按年龄分组统计后绘制折线图 male_binned = pd.cut(male_ages, bins=10).value_counts().sort_index() female_binned = pd.cut(female_ages, bins=10).value_counts().sort_index() plt.subplot(1,2,1) plt.plot(male_binned.index.astype(str), male_binned.values, color='purple') plt.xticks(rotation=45) # 旋转x轴标签避免重叠 # 后续标签、标题设置和之前的逻辑一致
内容的提问来源于stack exchange,提问作者Chuong Vo
相关产品推荐
相关产品推荐

