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)
我想通过 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)