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

时间:2013-04-20 12:39:58

标签: python matplotlib heatmap

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

以下是带有蒙版数组的灰度的最小示例(改编自here)。 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()

enter image description here

2 个答案:

答案 0 :(得分:11)

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

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()

enter image description here

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

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

为:

im = ax.pcolor(data, cmap=cm.gray, edgecolors='white', linewidths=1)

我们得到:

enter image description here

差异很微妙 - 不会在pcolor的相邻空单元格之间绘制线条。你喜欢哪种美学纯粹是个人的,但它强调了pcolorpcolormesh之间的关键区别。

答案 1 :(得分:3)

我无法通过ax.patch.set_hatch('x')添加补丁来重现Joe的答案。相反,我必须根据此question

将修补程序创建为矩形
import numpy as np
import matplotlib.pyplot as plt

import matplotlib.cm as cm
import matplotlib.patches as patches

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=0)
fig.colorbar(im)

# ax.patch.set_hatch('x')  replaced by:
p = patches.Rectangle((0,0), 25, 10, hatch='xx', fill=None,zorder=-10)
ax.add_patch(p)

plt.show()

此外,pcolormesh似乎现在已经整理好了,所以可以在这里使用它。