我试图生成具有大动态范围的numpy
数组的色彩映射。为此,我尝试使用imshow
中的matplotlib.pyplot
,但色彩映射似乎存在问题。
具体而言,数组中低于某个阈值的每个值都被绘制为与数组中最小值相同的颜色。
以下是一个最小的工作示例。我生成一个包含1e-4到1e + 20值的数组,但在imshow
中,所有包含小于1e + 3的值的单元格似乎都设置为等于1e-4。但是,使用pcolormesh
时没有此类问题。
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np
# 2d (5x5) array with large dynamic range: 1e-4, 1e-3, ..., 1e+20
a = np.logspace(-4, 20, num=25).reshape(5, 5)
# imshow producing wrong image
fig = plt.figure()
plt.imshow(a, norm=LogNorm(), origin='lower')
plt.colorbar()
fig.savefig("imshow_broken.png")
# pcolormesh producing correct image
fig = plt.figure()
plt.pcolormesh(a, norm=LogNorm())
plt.colorbar()
fig.savefig("pcolormesh_working.png")
我使用matplotlib
版本2.1.2,但旧版本上的问题似乎消失了,例如1.5.3,或许暗示最近matplotlib
版本中存在错误。