如何使用 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 中工作?