При отображении широкого диапазона значений с помощью imshow цвета отображаются некорректно - PullRequest
0 голосов
/ 06 апреля 2020

Если диапазон значений, отображаемых с помощью функции imshow matplotlib, велик (и необходима логарифмическая c нормализация), кажется, что некоторые значения не отображаются с правильным цветом, то есть цветом, который вы бы хотели ожидать от просмотра на цветовой панели. Я столкнулся с этой проблемой, работая над каким-то большим набором данных, но приведенный ниже код должен предоставить минимальный пример, который создает для меня этот сюжет .

Некоторые промежуточные значения (10 и 1e-2) ) неожиданно получают тот же цвет, что и самое низкое значение (1e-10) в данных испытаний. Если вместо 10 отображается 100, отображается «правильный» цвет. Проблема также исчезает, если максимальное значение (1e19) снижается, например, до 1e15, но увеличение минимального значения не имеет такого же эффекта.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors

TestGrid = np.array([[1e19, 10], [1e-2, 1e-10]])
LogNorm = colors.LogNorm(TestGrid.min(), TestGrid.max())

img = plt.imshow(TestGrid, norm=LogNorm, cmap='plasma')

plt.colorbar(img)
plt.show()

Чтобы изолировать проблему, я попытался проверить, что возвращает функция LogNorm, для одного из промежуточных значений:

cmap = plt.get_cmap('plasma')
print(cmap(LogNorm(10), bytes=True)) #prints (170, 36, 148, 255) 

Кажется, что он дает тот же цвет, что и вы можете ожидать от цветовой шкалы, и проблема, таким образом, заключается в функции imshow или colorbar.

Я также попытался использовать pcolor вместо imshow, и это фактически дает ожидаемый результат , Тем не менее, эта проблема все еще озадачивает меня, и я надеюсь, что кто-то может сказать мне, что идет не так.

Я использую python 3.6 и matplotlib 3.1, если это важно.

...