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