6

我正在创建要在出版物中使用的热图。该出版物仅限于黑白打印,因此我正在创建灰度热图。我遇到的问题是热图中有一些“不适用”的方块,我想在视觉上与其他单元格区分开来。我的理解是,如果热图在刻度的两端都有颜色,那么这可能(?)可以使用 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()

在此处输入图像描述

4

2 回答 2

14

一个简单的解决方案是只孵化背景轴补丁。例如:

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

于 2013-04-20T21:34:38.097 回答
3

我无法通过添加补丁来重现乔的答案ax.patch.set_hatch('x')。相反,我必须根据这个问题将补丁创建为矩形

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现在好像整理好了,可以在这里使用。

于 2013-10-28T16:53:06.133 回答