Я пытаюсь создать цветовые карты массивов 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.





этот пример дает такой же (неправильный) вывод в версии 2.2.2 (последняя стабильная на момент написания)