python - 具有视觉上不同的 "NA"正方形字段的 Matplotlib 灰度热图

标签 python matplotlib heatmap

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

最佳答案

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

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 之间的关键区别。

关于python - 具有视觉上不同的 "NA"正方形字段的 Matplotlib 灰度热图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16120481/

相关文章:

python - 在 for 循环中绘图,在 matplotlib 中具有 'hold on' 效果?

python - 根据聚类按行划分seaborn矩阵

database - 使用 PostGIS 从点数据生成热图/密度图

python - 云 Composer /Airflow : Relationships can only be set between Operators; received PythonOperator

python - 将 numpy ComplexWarning 捕获为异常

python - 与 ImageJ 相比,在 Python 上打开原始图像会产生不同的图像

javascript - Heatmap DC.js - 如何手动过滤多个项目

python - 从字典中的值列表中删除值

python - python @classmethod 可以继承吗?

python - 在 pandas/python 上绘制带有 Z 分数的概率密度函数