Python Matplotlib灰度热图,具有明显的“颜色”;不适用;方阵场

Python Matplotlib灰度热图,具有明显的“颜色”;不适用;方阵场,python,matplotlib,heatmap,Python,Matplotlib,Heatmap,我正在创建一个用于出版物的热图。出版物仅限于黑白印刷,因此我正在以灰度创建热图。我的问题是,在热图中有一些方块是“不适用”的,我想在视觉上与其他单元格区分开来。我的理解是,如果热图在比例尺的两端都是彩色的,使用numpy的遮罩阵列可能(?)是可能的,并且遮罩场可能只是显示为白色。问题是,我想用从白色到黑色的全光谱来说明非NA数据的范围。是否有其他视觉机制,如删除线,来区分NA细胞 下面是具有遮罩阵列(改编自)的灰度的最小示例。NA值可能在这里被掩盖了,你只是说不出来,因为它使用的是白色,而白色已

我正在创建一个用于出版物的热图。出版物仅限于黑白印刷,因此我正在以灰度创建热图。我的问题是,在热图中有一些方块是“不适用”的,我想在视觉上与其他单元格区分开来。我的理解是,如果热图在比例尺的两端都是彩色的,使用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()

一个简单的解决方案是只填充背景轴面片。例如:

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)
致:

我们将得到:


差别很小,相邻的空单元格之间不使用
pcolor
绘制线条。你喜欢哪种美学纯粹是个人的,但它突出了
pcolor
pcolormesh

之间的一个关键区别,我无法通过添加一个补丁来复制Joe的答案
ax.patch.set_hatch('x')
。取而代之的是,我必须按照如下所示,将补丁创建为一个矩形


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

嗨,乔!使用matplotlib版本1.4.3,我必须添加
ax.patch.set_edgecolor('black')
以使图案填充标记可见。我不确定这是一般需要的,还是仅仅因为我的版本旧了。@unutbu-谢谢!它也需要在1.5中设置。我暗中依赖于补丁的edgecolor设置,这从来都不是一件好事。不管版本之间有什么不同,最好明确地设置它。您好@JoeKington,谢谢您的回答。如果我想绘制一个巨大的矩阵(100k行,200列),但要绘制相同的东西,以便大致了解南的集中位置,该怎么办?@msalem-在这种情况下,使用
imshow
而不是
pcolor
pcolormesh
。您可以使用图案填充技巧,也可以使用colormap的
set_bad
方法将NaN设置为您想要的任何颜色/样式。不过,对于大型阵列,Imshow比其他选项快得多。
im = ax.pcolor(data, cmap=cm.gray, edgecolors='white', linewidths=1)
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()