如何使用 seaborn 和 ipywidgets 制作交互式条形图

How to make an interactive bar plot with seaborn and 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], 
         'Count': [1,1,1,1]} 
df = pd.DataFrame(data)

请注意,条目长度为 1000 秒,但我不想使用那么多 space 所以我使用的是简化得多的版本。

我正在尝试使用该数据通过 ipywidgets 制作交互式条形图。

age = ['20-25', '19<', '>75','20-25']
@interact(Age = age)
def f(Age):      
    df2= df[df['age'].str.contains(Age)].groupby('Year').sum() 
    df2['year'] = ['2018','2019']
    return sns.barplot(x="Year", y="Count", data=df2) 

x 轴是年份,y 轴是当年的参与者人数,您可以通过滚动条进行交互式过滤,并按您选择的年龄范围查看参与者人数。

我不知道该怎么做,所以我尝试 'brute force it' 并添加了一个计数列 1,这样即使数据集被过滤,我也能得到参与者的总数。我也蛮力强迫这些年,但有些年龄段不会在所有年份竞争,所以它坏了,没用。

年龄就是年龄范围的各种选项,我都放在一个列表里了。

  • 解决拼写问题,因为您正在互换大小写。数据框中的 none 值也是数字(这两个问题都在对 OP 的编辑中修复)。
  • age = df.Age.unique()
  • 创建 age
  • 重置索引而不是使用 df2['year'] = ['2018','2019']
age = df.Age.unique()
@interact(Age = age)
def f(Age):      
    df2 = df[df['Age'].str.contains(Age)].groupby('Year').count().reset_index()
    return sns.barplot(x="Year", y="Count", data=df2)

  • 不添加 'Count'
  • 不需要向数据框添加 'Count' 列,因为 .groupby('Year').count() 将为每个现有列提供计数,在这种情况下 y= 可以是 'Name''Age',但随后需要更改 ylabel
age = df.Age.unique()
@interact(Age = age)
def f(Age):      
    df2 = df[df['Age'].str.contains(Age)].groupby('Year').count().reset_index()
    p = sns.barplot(x="Year", y="Age", data=df2)
    p.set_ylabel('Count')
    return p
age = df.Age.unique()
@interact(Age = age)
def f(Age):      
    data = df[df['Age'].str.contains(Age)]
    return sns.countplot(data=data, x='Year')