使用Seaborn创建分组条形图时图例未显示全部类别求助
问题:分类条形图图例未显示所有年龄组类别
我尝试制作一个分类条形图,展示不同幸福评分(X轴)与年龄组(图例)下的婚外情发生人数,以下是我的Python代码:
import pandas as pd import seaborn as sns url = 'https://vincentarelbundock.github.io/Rdatasets/csv/AER/Affairs.csv' affairs = pd.read_csv(url) age_categorical = [] for row in affairs['age']: if 0<row<30: age_categorical.append("Under 30") elif 30<=row<=40: age_categorical.append("30 to 40 Years Old") elif 40<row<=55: age_categorical.append("41 to 55 years old") else: age_categorical.append("Older than 55") affairs['age_categorical'] = age_categorical # count number of affairs for each happiness rating affairs_subset = affairs.copy() affairs_subset = affairs_subset[affairs_subset["affairs_dummy"] != 0] affairs_rating = affairs_subset.groupby('rating').size() # create dataframe table for plot happiness = pd.DataFrame({ 'Happiness rating' : [1, 2, 3, 4, 5], 'Number of Affairees': [8, 33, 27, 48, 34] }) # put in barplot plot = sns.barplot(x = 'Happiness rating', y='Number of Affairees', hue=affairs['age_categorical'],data = happiness).set(title='Happiness and extra-marital affairs')
但生成的条形图图例未显示所有年龄组类别,效果图如下:
问题原因及解决方案
核心问题
当前代码逻辑存在两处关键错误:
- 用于绘图的
happiness数据框仅包含幸福评分和总婚外情人数,没有按年龄组拆分数据 hue参数直接调用原数据集的age_categorical列,与绘图数据无关联,导致Seaborn无法识别完整的年龄组类别
修正步骤
- 按「幸福评分+年龄组」双重分组,统计每个细分组的婚外情人数
- 重构符合Seaborn绘图要求的数据集
- 用正确的数据集重新绘制条形图
修正后的代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt url = 'https://vincentarelbundock.github.io/Rdatasets/csv/AER/Affairs.csv' affairs = pd.read_csv(url) # 用pd.cut替代循环,高效生成年龄分组 affairs['age_categorical'] = pd.cut( affairs['age'], bins=[0, 30, 40, 55, float('inf')], labels=["Under 30", "30 to 40 Years Old", "41 to 55 years old", "Older than 55"] ) # 筛选有婚外情的数据,按幸福评分+年龄组分组统计 affairs_subset = affairs[affairs["affairs_dummy"] != 0] grouped_data = affairs_subset.groupby(['rating', 'age_categorical']).size().reset_index(name='Number of Affairees') # 绘制分类条形图 plt.figure(figsize=(10, 6)) sns.barplot( x='rating', y='Number of Affairees', hue='age_categorical', data=grouped_data ) plt.title('Happiness and extra-marital affairs') plt.xlabel('Happiness rating') plt.ylabel('Number of Affairees') plt.legend(title='Age Group') plt.show()
关键改进点
- 使用
pd.cut()替代手动循环,代码更简洁且不易出错 - 双重分组确保每个幸福评分下的各年龄组数据都被统计到
- 绘图数据与
hue参数完全关联,Seaborn能正确识别所有年龄组并显示完整图例
内容的提问来源于stack exchange,提问作者Shehzadi Aziz
相关产品推荐
相关产品推荐

