Matplotlib灰度热图,具有视觉上不同的"NA"方块字段

Bry*_*mas 5 python matplotlib heatmap

我正在创建一个用于出版物的热图.该出版物仅限于黑白打印,因此我正在以灰度创建热图.我遇到的问题是热图中有一些"不适用"的正方形,我希望在视觉上区别于其他单元格.我的理解是,如果热图在刻度的两端都有颜色,那么使用numpy的蒙版数组可能(?)可以实现,并且被遮罩的字段可以简单地显示为白色.问题是,我想使用从白到黑的全光谱来说明非NA数据的范围.反正是否有区分NA细胞与其他视觉机制,如删除线?

下面是带有掩码阵列的灰度的最小示例(从此处改编).NA值可能在这里被掩盖,你只是无法分辨,因为它使用的是白色,它已被用作有效光谱高端的颜色.

import numpy as np
from pylab import *

z = rand(10, 25)
z = np.ma.masked_array(z,mask=z>0.8)

c = pcolor(z)
set_cmap('gray')
colorbar()
c = pcolor(z, edgecolors='w', linewidths=1)
axis([0,25,0,10])
savefig('plt.png')
show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Joe*_*ton 11

一个简单的解决方案就是孵化背景轴补丁.例如:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
np.random.seed(1977)

data = np.random.random((10,25))
data = np.ma.masked_greater(data, 0.8)

fig, ax = plt.subplots()
im = ax.pcolormesh(data, cmap=cm.gray, edgecolors='white', linewidths=1,
                   antialiased=True)
fig.colorbar(im)

ax.patch.set(hatch='xx', edgecolor='black')

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,如果您不希望在空单元格之间绘制边框,则可以使用pcolor而不是pcolormesh.例如,如果我们更改该行:

im = ax.pcolormesh(data, cmap=cm.gray, edgecolors='white', linewidths=1,
                   antialiased=True)
Run Code Online (Sandbox Code Playgroud)

至:

im = ax.pcolor(data, cmap=cm.gray, edgecolors='white', linewidths=1)
Run Code Online (Sandbox Code Playgroud)

我们会得到:

在此输入图像描述

差异很微妙 - 相邻的空单元格之间没有绘制线条pcolor.你喜欢哪种美学纯粹是个人的,但它突出了pcolor和之间的关键区别pcolormesh.