为什么 matplotlib 以不同于零的方式绘制 nan?

Why is matplotlib plotting nan differently than zeros?

我有一个 2D numpy 数组,我想对其进行遮罩和绘制。这个我试过了。

import numpy as np
import matplotlib.pyplot as plt

a = np.random.random((101,99))

data1 = a.copy()
bound = np.percentile(data1, 80)
data1[data1<bound] = np.nan
plt.figure()
plt.imshow(data1)

输出:

data2 = a.copy()
data2[data2 < bound] = 0
plt.figure()
plt.imshow(data2)

输出:

我希望第一张图片看起来像第二张图片,其中白色像素的数量与深蓝色像素的数量相同,并且白色像素与深蓝色像素的位置相同。显然,白色像素比深蓝色像素多。我觉得我缺少一些简单的东西。我的 matplotlib 配置有问题吗?

编辑:

为了显示第一张图片实际上比第二张图片有更多的白色像素——并且没有抗锯齿效果——我使用 plt.gca().set_facecolor('black'):

重新运行了代码块
a = np.random.random((101,99))

data1 = a.copy()

bound = np.percentile(data1, 80)
data1[data1<bound] = np.nan
plt.figure()
plt.imshow(data1)
plt.gca().set_facecolor('black')

输出:

data2 = a.copy()
data2[data2 < bound] = 0
plt.figure()
plt.imshow(data2)

输出:

正如其他人指出的那样,这似乎是由于插值造成的。在我的机器上,运行 你的代码,除了背景之外,两个图之间没有区别。尝试明确关闭插值:

plt.imshow(data1, interpolation='nearest')

效果是由于抗锯齿。对于屏幕上的每个像素,matplotlib 平均出数据的相应像素。如果其中一个数据像素为NaN,则整个屏幕像素被认为是透明的。使用零而不是 NaNs,使用标准平均值。

以下代码示例说明了正在发生的事情。

import numpy as np
import matplotlib.pyplot as plt

a = np.random.random((101, 99))

data1 = a.copy()
bound = np.percentile(data1, 80)
data1[data1 < bound] = np.nan
fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(15, 6))
ax1.imshow(data1)
ax2.imshow(data1)
ax2.set_facecolor('black')

data2 = a.copy()
data2[data2 < bound] = 0
ax3.imshow(data2)
plt.tight_layout()
plt.show()

现在,相同,但 figsize=(10,4)