我想通过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)
返回
我想要做的是绘制一个整体的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的单元格应该用白色着色,因为没有值)。
答案 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)