使用 Seaborn FacetGrid 绘制相关热图
Plotting correlation heatmaps with Seaborn FacetGrid
我正在尝试使用热图创建单个图像,热图分别代表每个标签的数据点特征的相关性。使用 seaborn,我可以像这样
为单个 class 创建热图
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()))
遗憾的是我得到了这个对我来说毫无意义的东西:
没有 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
之前通过 corr
正确传递来自 g.facet_data()
生成器的数据。
事实证明,如果你使用 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 : floats, optional
Values to anchor the colormap, otherwise they are inferred from the data and other keyword arguments.
我正在尝试使用热图创建单个图像,热图分别代表每个标签的数据点特征的相关性。使用 seaborn,我可以像这样
为单个 class 创建热图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()))
遗憾的是我得到了这个对我来说毫无意义的东西:
没有 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()
heatmap
之前通过 corr
正确传递来自 g.facet_data()
生成器的数据。
事实证明,如果你使用 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 : floats, optional
Values to anchor the colormap, otherwise they are inferred from the data and other keyword arguments.