2015-04-12 132 views
5

我正尝试使用分别代表每个标签的数据点要素相关性的热图创建单个图像。随着seaborn我可以创建一个热图像这么使用Seaborn FacetGrid绘制相关热点地图

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())) 

而可悲的是,我得到这里面是没有意义对我说:

Failing attempt to plot all classes

+0

你想要九个热点图,每个显示一个目标内的相关性? – cphlewis

+0

是的,我接受了@cphlewis的回答,因为它可行,但是我目前喜欢seaborn的是,你可以快速和肮脏地绘制东西,因为你几乎可以告诉它“绘制这个”并且它会提出一些东西。我的用例非常多:对于我来说,如何安排热点图或显示哪些轴不是很重要,只是以我所要求的格式查看信息。所以得到的lambda的东西工作将是非常有用的:) – fakedrake

+0

是的,我冲了它,并没有点击按钮妥善thanx :) – fakedrake

回答

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参数:

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() 

enter image description here 也许有一种方法来建立一个lambda通过正确地传递从g.facet_data()发电机数据corr之前去heatmap