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

Posted

技术标签:

【中文标题】如何使用 seaborn 和 ipywidgets 制作交互式条形图【英文标题】:How to make an interactive bar plot with seaborn and ipywidgets 【发布时间】:2022-01-09 08:02:55 【问题描述】:

我有一个包含运动员、他们的年龄范围和他们参加比赛的年份的数据集:

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 多个条目,但我不想使用那么多空间,所以我使用了一个非常简化的版本。

我正在尝试使用 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 轴是当年的参与者数量,您可以通过滚动条进行交互过滤,并按您选择的年龄范围查看参与者数量。

我不知道该怎么做,所以我尝试“暴力破解”并添加了一个计数列 1,这样即使数据集被过滤,我也能得到参与者的总数。我也蛮力强迫了这些年,但有些年龄范围并不是所有年份都在竞争,所以它坏了,它不起作用。

年龄是年龄范围的所有各种选项,我把它们都放在一个列表中。

【问题讨论】:

【参考方案1】: 修复拼写问题,因为您正在互换大小写。此外,数据框中的值都不是数字(在对 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',但随后是@987654338 @ 需要更改。
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
改用seaborn.countplot
age = df.Age.unique()
@interact(Age = age)
def f(Age):      
    data = df[df['Age'].str.contains(Age)]
    return sns.countplot(data=data, x='Year')

【讨论】:

以上是关于如何使用 seaborn 和 ipywidgets 制作交互式条形图的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ipywidgets 在 Jupyter Lab 中工作?

ipywidgets:如何在两列中组织滑块

如何在运行代码时更新 ipywidget 值?

如何使用用户在Juypter中使用ipywidgets UI控件设置的值以交互方式更新乳胶方程式?

使用 ipywidgets 按钮返回 DataFrame

使用线程定期更新的 Ipywidget