【问题标题】:Plotting correlation heatmaps with Seaborn FacetGrid使用 Seaborn FacetGrid 绘制相关热图
【发布时间】:2015-06-17 23:52:48
【问题描述】:

我正在尝试创建一个带有热图的图像,分别表示每个标签的数据点特征的相关性。使用 seaborn,我可以像这样为单个类创建热图

grouped = df.groupby('target')
sns.heatmap(grouped.get_group('Class_1').corr())

我明白这是有道理的:

然后我尝试像这样列出所有标签:

g = sns.FacetGrid(df, col='target')
g.map(lambda grp: sns.heatmap(grp.corr()))

很遗憾,我明白了这对我来说毫无意义:

【问题讨论】:

  • 您想要九个热图,每个都显示一个目标内的相关性?
  • 是的,我接受了@cphlewis 的回答,因为它有效,但到目前为止,我喜欢 seaborn 的一点是你可以快速而肮脏地绘制东西,因为你几乎可以告诉它“绘制这个“它会想出一些东西。我的用例几乎就是这样:对我来说,如何排列热图或显示什么轴并不是很重要,只是以我要求的格式查看该信息。所以让 lambda 工作会非常有帮助:)
  • 是的,我赶时间并没有正确点击按钮thanx :)
  • 有趣的是我注意到了!无论如何,我花了一段时间设置一个 lambda。您可以看到每个方面的数据,但不能在适当的位置更改它,并且热图期望其参数的方式不像情节等那样,期望他们的数据轻松映射,简而言之,自己滚动看起来像这样去。也许如果你把标题更具体一点,seaborn 专家会注意到——“将相关热图绘制到 FacetGrid 中”,也许?
  • 您的map_dataframe 解决方案是正确的——您可能想在下面添加它,因为我一开始没有看到它,正准备把它写下来作为答案。但是 cphlewis 的例子也很好,因为通常在 matplotlib 中创建一个 Axes 网格并使用 for 循环比尝试将数据转换为 FacetGrid 期望的格式更容易。

标签: python pandas plot seaborn


【解决方案1】:

如果你使用 map_dataframe 而不是 map,你可以非常简洁地使用 seaborn:

g = sns.FacetGrid(df, col='target')
g.map_dataframe(lambda data, color: sns.heatmap(data.corr(), linewidths=0))

@mwaskom 在他的评论中指出,明确设置颜色图的限制可能是个好主意,以便可以更直接地比较不同的方面。 documentation 描述了相关的heatmap 参数:

vminvmax:浮动,可选

锚定颜色图的值,否则它们是从数据和其他关键字参数中推断出来的。

【讨论】:

    【解决方案2】:

    没有 FacetGrid,但为列中的每个组制作一个 corr 热图:

    import pandas as pd
    import seaborn as sns
    from numpy.random import randint
    import matplotlib.pyplot as plt
    
    
    df = pd.DataFrame(randint(0,10,(200,12)),columns=list('abcdefghijkl'))
    grouped = df.groupby('a')
    rowlength = grouped.ngroups/2 # fix up if odd number of groups
    fig, axs = plt.subplots(figsize=(9,4), nrows=2, ncols=rowlength)
    
    targets = zip(grouped.groups.keys(), axs.flatten())
    for i, (key, ax) in enumerate(targets):
        sns.heatmap(grouped.get_group(key).corr(), ax=ax,
                    xticklabels=(i >= rowlength),
                    yticklabels=(i%rowlength==0),
                    cbar=False) # Use cbar_ax into single side axis
        ax.set_title('a=%d'%key)
    plt.show()
    

    也许有一种方法可以设置一个 lambda,以便在转到 heatmap 之前正确地将来自 g.facet_data() 生成器的数据通过 corr 传递。

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 2018-12-09
      • 2019-01-23
      • 2018-11-23
      • 2014-10-31
      • 1970-01-01
      • 2020-10-12
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多