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

pandas/seaborn - plot heatmap data distributions on a square grid

我想通过 pandas 和 seaborn 在热图上绘制数据的空间二维分布。假设我有这个简单的 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) 

returns

我想做的是绘制一个完整的 5 x 5 正方形网格,其中数据帧的索引表示单元格编号,即从 0 开始,5 x 5 网格的代码如下所示(从上到下):

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 的单元格应为白色,因为那里没有值)。

剧情看起来有点奇怪。 :-) 无论如何,关键步骤是首先通过 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)