如何使用seaborn与ipywidgets制作交互式条形图
代码修正方案
你现有代码的报错主要由列名拼写错误、硬编码年份长度不匹配两个核心问题导致,按以下方式调整即可实现预期效果:
完整可运行代码
import ipywidgets as widgets from ipywidgets import interact import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 初始化数据集 data = {'Name':['Tom', 'Nick', 'Chris', 'Jack'], 'Age':['20-25', '19<', '>75', '20-25'], 'Year':[2019,2019,2018,2018]} df = pd.DataFrame(data) # 自动生成去重后的年龄区间选项,不用手动维护 age_options = sorted(df['Age'].unique()) @interact(Age = age_options) def draw_plot(Age): # 用正确的大写Age列名筛选,分组后直接统计人数,不需要额外Count列 filtered_df = df[df['Age'] == Age].groupby('Year', as_index=False).size() # 重命名统计列,方便绘图调用 filtered_df.rename(columns={'size':'参赛人数'}, inplace=True) # 兼容空数据场景,避免绘图报错 if filtered_df.empty: print("当前年龄区间无参赛记录") return sns.barplot(x="Year", y="参赛人数", data=filtered_df) plt.show()
关键修改说明
- 修正了列名拼写错误:原代码误用小写
age,数据集实际字段为大写Age - 移除硬编码年份逻辑:分组统计后自动保留存在参赛记录的年份,不会出现长度不匹配的报错
- 自动生成年龄选项:通过
df['Age'].unique()自动提取去重后的年龄区间,不需要手动维护列表,适配真实场景下的大量数据 - 去掉冗余的Count列:用
groupby.size()直接统计每个年份的参赛人数,逻辑更简洁 - 增加空数据兼容逻辑:如果选中的年龄区间没有参赛记录会给出提示,不会抛出异常
内容的提问来源于stack exchange,提问作者Harleens
相关产品推荐
相关产品推荐

