首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matplotlib灰度热图,具有视觉上明显的"NA“正方形区域

Matplotlib灰度热图,具有视觉上明显的"NA“正方形区域
EN

Stack Overflow用户
提问于 2013-04-20 20:39:58
回答 2查看 10.1K关注 0票数 6

我正在创建一个要在出版物中使用的热图。该出版物仅限于黑白打印,因此我创建了灰度热图。我的问题是,在热图中有一些方块是“不适用的”,我想从视觉上区分其他单元。我的理解是这可能(?)如果热图在标度的两端都着色,则可以使用numpy的掩码数组,并且掩码字段可能仅显示为白色。问题是,我想使用从白到黑的全光谱来说明非NA数据的范围。有没有办法用其他的视觉机制来区分NA细胞,比如删除线?

下面是一个带有遮罩阵列的灰度的最小示例(改编自here)。NA值可能在这里被遮蔽了,你无法分辨,因为它使用的是白色,而白色已经被用作有效光谱的高端颜色。

代码语言:javascript
复制
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()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-21 05:34:38

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

代码语言:javascript
复制
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

代码语言:javascript
复制
im = ax.pcolormesh(data, cmap=cm.gray, edgecolors='white', linewidths=1,
                   antialiased=True)

至:

代码语言:javascript
复制
im = ax.pcolor(data, cmap=cm.gray, edgecolors='white', linewidths=1)

我们会得到:

区别很细微--使用pcolor不会在相邻的空单元格之间绘制线条。你更喜欢哪种美学纯粹是个人的,但它突出了pcolorpcolormesh之间的一个关键区别。

票数 14
EN

Stack Overflow用户

发布于 2013-10-29 00:53:06

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

代码语言:javascript
复制
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似乎已经解决了问题,所以可以在这里使用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16120481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档