Seaborn绘图数据帧由多个groupby生成

2024-09-24 00:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有熊猫数据框,其中我在两个类别(正、负)中嵌套了4个类别(50、60、70、80),我想基于groupby用seaborn kdeplot绘制一个列(例如a_mean…)。我想要实现的是这个picture(这是通过将熊猫拆分成一个列表来实现的)。我浏览了好几篇文章,如果我想为每一个游戏绘制此图,此代码(Multiple single plots in seaborn with pandas groupby data)适用于一个级别,但不适用于两个级别:

for i, group in df_hb_SLR.groupby('Condition'):
    sns.kdeplot(data=group['A_mean_per_subject'], shade=True, color='blue', label = 'label name')

我试图使用这个(Seaborn groupby pandas Series),但第一个答案对我不起作用:

sns.kdeplot(df_hb_SLR.A_mean_per_subject, groupby=df_hb_SLR.Game_RS)

AttributeError: 'Line2D' object has no property 'groupby'

而这个关键性的答案我没能成功。 有没有直接从seaborn或者直接从pandas Dataframe的更好方法

我的数据可以csv格式under this link -- data访问,我会像往常一样加载它们:

df_hb_SLR = pd.read_csv('data.csv')

谢谢你的帮助


Tags: csv数据inpandasdfdata绘制seaborn
1条回答
网友
1楼 · 发布于 2024-09-24 00:27:47

这里有一个使用seaborn的FacetGrid的解决方案,它使这类事情变得非常简单

g = sns.FacetGrid(data=df_hb_SLR, col="Condition", hue='Game_RS', height=5, aspect=0.5)
g = g.map(sns.kdeplot, 'A_mean_per_subject', shade=True)
g.add_legend()

enter image description here

FacetGrid的缺点是它创建了一个新图形,因此如果您想将这些图集成到一个更大的子图集合中,可以使用groupby()和一些循环实现相同的结果:

group1 = "Condition"
N1 = len(df_hb_SLR[group1].unique())
group2 = 'Game_RS'
target = 'A_mean_per_subject'
height = 5
aspect = 0.5
colour = ['gray', 'blue', 'green', 'darkorange']


fig, axs = plt.subplots(1,N1, figsize=(N1*height*aspect,N1*height*aspect), sharey=True)

for (group1Name,df1),ax in zip(df_hb_SLR.groupby(group1),axs):
    ax.set_title(group1Name)
    for (group2Name,df2),c in zip(df1.groupby(group2), colour): 
        sns.kdeplot(df2[target], shade=True, label=group2Name, ax=ax, color = c) 

enter image description here

相关问题 更多 >