我正在创建一个用于出版物的热图。该出版物仅限于黑白打印,因此我正在以灰度创建热图。我遇到的问题是热图中有一些“不适用”的正方形,我希望在视觉上区别于其他单元格。我的理解是,如果热图在刻度的两端都有颜色,那么使用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()
答案 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()
请注意,如果您不希望在空单元格之间绘制边框,则可以使用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)
我们得到:
差异很微妙 - 不会在pcolor
的相邻空单元格之间绘制线条。你喜欢哪种美学纯粹是个人的,但它强调了pcolor
和pcolormesh
之间的关键区别。
答案 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
似乎现在已经整理好了,所以可以在这里使用它。