Matplotlib灰度热图,带有明显的“NA”正方形区域

2024-06-07 22:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: importnumpynp光谱视觉数组出版物方块
2条回答

我无法通过ax.patch.set_hatch('x')添加补丁来复制乔的答案。相反,我必须根据这个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现在似乎已经整理好了,所以可以在这里使用它。

一个简单的解决方案是只填充背景轴补丁。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之间的一个关键区别。

相关问题 更多 >

    热门问题