为什么 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
,则整个屏幕像素被认为是透明的。使用零而不是 NaN
s,使用标准平均值。
以下代码示例说明了正在发生的事情。
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)
我有一个 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
,则整个屏幕像素被认为是透明的。使用零而不是 NaN
s,使用标准平均值。
以下代码示例说明了正在发生的事情。
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)