【问题标题】:Seaborn plot pandas dataframe by multiple groupbySeaborn通过多个groupby绘制熊猫数据框
【发布时间】:2020-05-06 15:05:08
【问题描述】:

我有 pandas 数据框,其中我在两个类别(正面、负面)中嵌套了 4 个类别(50、60、70、80),我想用一列的 seaborn kdeplot(例如,A_mean... ) 基于 groupby。我想要实现的是(这是通过将熊猫拆分为列表来完成的)。我浏览了几篇文章,如果我想为每个 Game_RS 绘制此代码,此代码 (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')

感谢您的帮助。

【问题讨论】:

    标签: python pandas pandas-groupby seaborn


    【解决方案1】:

    这里有一个使用 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()
    

    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) 
    

    【讨论】:

    • 您好 Diziet,非常感谢您的回答。我对第二个问题有两个小问题,for循环解决方案。 1)你能描述一下groupby对象的循环是如何工作的吗?因为2)我想为每个游戏添加自定义颜色,我试图将您的解决方案概括为:``` color = ['gray', 'blue', 'green', 'darkorange'] ... for (group1Name, df1),ax in zip(df_hb_SLR.groupby(group1),axs): ax.set_title(group1Name) for (group2Name,df2), colour in zip(df1.groupby(group2), colour): sns.kdeplot(df2[目标],阴影=真,标签=组2名称,斧头=斧头,颜色=颜色)```
    • 您的代码几乎是正确的,只是您在 for 循环中两次使用了相同的名称 colour。我已经修改了答案。
    • 还有一个问题。如果我更改组,即。 group1 = 'Game_RS'; group2 = 'Condition' 然后我想使用 2 行,2 列,fig, axs = plt.subplots(2,2, figsize=(N1*height*aspect,N1*height*aspect), sharey=True) 我得到这个错误:AttributeError: 'numpy.ndarray' object has no attribute 'set_title'。你知道为什么以及如何解决它吗?如果我使用(1,N1),它可以工作。谢谢
    • 关于这个错误的帖子很多。例如see here。基本上,如果您执行的操作超过 1 行或 1 列,则返回的对象是 2D numpy 数组。你可以循环使用for (...),ax in zip(..., axs.flat):
    猜你喜欢
    • 2016-04-21
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2017-05-18
    • 1970-01-01
    • 2018-03-10
    • 2016-10-09
    相关资源
    最近更新 更多