使用Seaborn FacetGrid绘制相关性热力图

9

我正在尝试创建一张图像,其中包含热力图,分别表示每个标签数据点特征之间的相关性。使用seaborn库,我可以为单个类创建一个热力图,如下所示:

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

我可以担任翻译任务。以下是您需要翻译的内容:

我得到了这个东西,它很有道理:

Class_1 correlation heatmap

但是当我试图列出所有标签时,就像这样:

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

不幸的是,我得到了这个对我来说毫无意义的东西:

尝试绘制所有类失败


您想要九个热力图,每个图显示一个单一目标内的相关性吗? - cphlewis
是的,我接受了 @cphlewis 的答案,因为它能用,但到目前为止我喜欢 seaborn 的一点是你可以快速而不费力地绘制图形,基本上你可以告诉它“绘制这个”,它就会展示出来。我的使用情况基本上就是这样:对于热图如何排列或显示哪些轴并不是很重要,只是想以我所请求的格式看到信息。所以让 lambda 这个东西起作用将非常有帮助 :) - fakedrake
是的,我匆忙了一下,没有正确地点击按钮,谢谢 :) - fakedrake
1
有趣的是我注意到了!无论如何,我花了一些时间来设置一个lambda。你可以看到每个方面的数据,但不能直接修改它,而且heatmap期望其参数的方式与plot等不太相似,因此自己编写代码似乎是最好的选择。也许如果你把标题更具体一些,seaborn专家会注意到——比如“将相关热图绘制到FacetGrid中”? - cphlewis
1
你的 map_dataframe 解决方案是正确的 - 你可以将它添加在下面,因为我一开始没有看到它,正准备写成答案。但 cphlewis 的例子也很好,因为通常在 matplotlib 中只需制作一个 Axes 网格并使用 for 循环比尝试将数据扭曲成 FacetGrid 期望的格式更容易。 - mwaskom
显示剩余2条评论
2个回答

12

如果你使用 map_dataframe 而不是 map,那么只需使用 seaborn 即可非常简洁地完成它:

Turns out you can do it pretty concisely with just seaborn if you use `map_dataframe` instead of `map`:
g = sns.FacetGrid(df, col='target')
g.map_dataframe(lambda data, color: sns.heatmap(data.corr(), linewidths=0))

@mwaskom指出,根据他的评论,明确设置颜色映射的限制可能是一个好主意,这样可以更直接地比较不同方面。相关的heatmap参数在文档中有描述:

vminvmax:浮点数,可选

锚定颜色映射的值,否则从数据和其他关键字参数中推断。


4

如果没有使用FacetGrid,但是要为每个列中的组生成相关性热力图:

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来正确地将g.facet_data()生成器的数据通过corr传递,然后再进入heatmap

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接