Matplotlib imshow colormap未涵盖完整的动态数据范围

时间:2018-06-15 15:56:24

标签: python-3.x matplotlib imshow

我试图生成具有大动态范围的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版本中存在错误。

imshowimshow_broken

pcolormeshpcolormesh_working

0 个答案:

没有答案