pandas / seaborn - 在正方形网格上绘制热图数据分布

时间:2015-07-23 13:14:51

标签: python pandas seaborn

我想通过pandas和seaborn在热图上绘制数据的空间2D分布。我们说我有这个简单的codes.csv文件:

Code,Value
2,4
5,6
7,1
9,2
10,1

在seaborn中绘制简单的热图非常简单,只需:

df = pd.read_csv('codes.csv',index_col='Code')

然后

sns.heatmap(df) 

返回

enter image description here

我想要做的是绘制一个整体的5 x 5方格,其中数据帧的索引表示5 x 5网格代码的单元格编号,即从0开始,如下所示(top to底部):

20,21,22,23,24
15,16,17,18,19
10,11,12,13,14
5,6,7,8,9
0,1,2,3,4

并且生成的热图应该将数据框的Code列映射到网格表示(以便11到25的单元格应该用白色着色,因为没有值)。

1 个答案:

答案 0 :(得分:1)

情节看起来有点奇怪。 :-)无论如何,关键步骤首先通过sns.set(style="white")将背景颜色设置为白色,然后使用mask参数绘制堆映射以删除那些不需要的值。

# your data
# ==============================================================

df

   Code  Value
0     2      4
1     5      6
2     7      1
3     9      2
4    10      1


data_mat = df.set_index('Code').reindex(np.arange(25)).values.reshape(5,5)[::-1]
data_mat

array([[ nan,  nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan,  nan],
       [  1.,  nan,  nan,  nan,  nan],
       [  6.,  nan,   1.,  nan,   2.],
       [ nan,  nan,   4.,  nan,  nan]])

# create a mask for NaN values, these values won't be plotted
mask = np.isnan(data_mat)

mask

array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True],
       [False,  True, False,  True, False],
       [ True,  True, False,  True,  True]], dtype=bool)


# plot
# ==============================================================
import seaborn as sns

sns.set(style="white")
f, ax = plt.subplots()
# use a diverging color to emphasize on negative and positive corr
cmap = sns.cubehelix_palette(12, start=2.5, as_cmap=True)
sns.heatmap(data_mat, mask=mask, cmap=cmap, ax=ax)

enter image description here