技术咨询:使用Matplotlib和Pandas为堆叠柱状图添加注释
优化年龄与满意度分布的堆叠柱状图
看起来你已经有了一个不错的开头!我来帮你补全代码并优化这个堆叠柱状图,让它更清晰直观,完全适配你的分类数据展示需求。
完整代码示例
先补全你的随机数据生成逻辑,再添加专业的可视化代码(结合matplotlib和seaborn,兼顾美观与实用性):
import random import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 生成符合要求的随机调查数据 data = [] for i in range(500): # 修正Age取值为1-5(和你描述的分类数据范围一致) sample = { "Age": random.randint(1,5), "Income": random.randint(1,5), "Satisfaction": random.randint(1,5) } data.append(sample) df = pd.DataFrame(data) # 快速统计各年龄组的满意度分布:用交叉表实现高效分组计数 satisfaction_by_age = pd.crosstab(df['Age'], df['Satisfaction']) # 设置专业绘图风格 sns.set_style("whitegrid") # 绘制堆叠柱状图 satisfaction_by_age.plot(kind='bar', stacked=True, figsize=(10,6), colormap='viridis') # 添加清晰的图表元素 plt.title('Satisfaction Distribution Across Age Groups', fontsize=14) plt.xlabel('Age Group (1-5)', fontsize=12) plt.ylabel('Number of Respondents', fontsize=12) # 把图例移到外侧,避免遮挡柱子 plt.legend(title='Satisfaction Level', bbox_to_anchor=(1.05, 1), loc='upper left') # 年龄标签不旋转,提升可读性 plt.xticks(rotation=0) # 自动调整布局,防止元素被截断 plt.tight_layout() plt.show()
关键优化点说明
- 数据对齐修正:把Age的取值从
0-5调整为1-5,和你描述的分类数据范围完全匹配 - 高效统计方式:用
pd.crosstab替代手动循环,快速生成各年龄组的满意度分布统计结果,代码更简洁高效 - 可视化细节优化:
- 使用
viridis配色方案,颜色区分度高且符合无障碍设计标准 - 将图例移至图表外侧,避免遮挡核心数据
- 保留x轴年龄标签的水平显示,提升阅读舒适度
- 添加明确的标题和坐标轴标签,让图表信息一目了然
- 使用
扩展功能(可选)
如果想结合Income维度做更深入的分析,可以生成按年龄+收入分组的堆叠图:
# 按年龄和收入双重分组,统计满意度分布 satisfaction_by_age_income = pd.crosstab([df['Age'], df['Income']], df['Satisfaction']) satisfaction_by_age_income.plot(kind='bar', stacked=True, figsize=(12,8), colormap='viridis') plt.title('Satisfaction Distribution Across Age & Income Groups', fontsize=14) plt.xlabel('Age Group - Income Group', fontsize=12) plt.ylabel('Number of Respondents', fontsize=12) plt.legend(title='Satisfaction Level', bbox_to_anchor=(1.05, 1), loc='upper left') plt.xticks(rotation=45) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Titus Pullo
相关产品推荐
相关产品推荐

