我正在尝试使用热图创建单个图像,分别表示每个标签的数据点特征的相关性。使用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()))
可悲的是,我得到的这对我来说毫无意义:
答案 0 :(得分:5)
如果你使用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
参数:
vmin , vmax :浮动,可选
用于锚定色彩映射的值,否则它们是从数据和其他关键字参数推断出来的。当发散数据集时 推断,其中一个值可能会被忽略。
答案 1 :(得分:4)
没有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,以便在转到g.facet_data()
之前正确地将数据从corr
生成器传递到heatmap
。