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

使用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无法识别完整的年龄组类别

修正步骤

  1. 按「幸福评分+年龄组」双重分组,统计每个细分组的婚外情人数
  2. 重构符合Seaborn绘图要求的数据集
  3. 用正确的数据集重新绘制条形图

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:15:33