Проблемы с нулями в matplotlib.colors.LogNorm

Я строю гистограмму, используя

plt.imshow(hist2d, norm = LogNorm(), cmap = gray)

где hist2d — матрица значений гистограммы. Это работает нормально, за исключением элементов в hist2d, которые равны нулю. В частности, я получаю следующее изображение

Гистограмма

но хотелось бы, чтобы белые пятна были черными.

Спасибо!


person Till Hoffmann    schedule 26.02.2012    source источник


Ответы (3)


Вот альтернативный метод, который не требует, чтобы вы возились с вашими данными, устанавливая значение rgb для плохих пикселей.

import copy
data = np.arange(25).reshape((5,5))
my_cmap = copy.copy(matplotlib.cm.get_cmap('gray')) # copy the default cmap
my_cmap.set_bad((0,0,0))
plt.imshow(data, 
           norm=matplotlib.colors.LogNorm(), 
           interpolation='nearest', 
           cmap=my_cmap)

Проблема в том, что бины с 0 не могут быть должным образом нормализованы, поэтому они помечаются как «плохие», которые сопоставляются по-разному. Поведение по умолчанию — ничего не рисовать на этих пикселях. Вы также можете указать, каким цветом рисовать пиксели, которые выходят за пределы карты цветов или находятся за ними (по умолчанию они рисуются как самый высокий/самый низкий цвет).

person tacaswell    schedule 01.02.2013
comment
Если вы используете не 'gray', а, например, палитру 'viridis', то вы можете взять цвет для плохих пикселей из палитры: my_cmap.set_bad(my_cmap.colors[0]). - person Dietmar; 14.08.2018
comment
Отличное решение! Почему вы добавили interpolation='nearest'? - person Kalo; 09.05.2021
comment
Потому что этот ответ был до того, как мы изменили интерполяцию по умолчанию с билинейной! - person tacaswell; 13.05.2021

Если вы довольны масштабированием цвета как есть и просто хотите, чтобы значения 0 были черными, я бы просто изменил входную матрицу, чтобы 0 были заменены следующим наименьшим значением:

import matplotlib.pyplot as plt
import matplotlib.cm, matplotlib.colors
import numpy

hist2d = numpy.arange(9).reshape(3,3)

plt.imshow(numpy.maximum(hist2d, sorted(hist2d.flat)[1]), 
           interpolation='nearest', 
           norm = matplotlib.colors.LogNorm(), 
           cmap = matplotlib.cm.gray)

производит

0-›минимальное изображение

person DSM    schedule 26.02.2012

Было ли это сгенерировано с помощью функции matplotlib hist2d?

Все, что вам нужно сделать, это просмотреть матрицу и установить произвольное минимальное значение, а затем обязательно построить его с фиксированными пределами.

for f in hist2d:
   f += 1e-3

затем, когда вы показываете рисунок, все пробелы теперь будут соответствовать минимальному значению и будут отображаться на логарифмически нормальном графике. Однако, если вы позволяете hist2d автоматически выбирать масштабирование за вас, он захочет использовать минимальное значение 1e-3. Чтобы этого не произошло, нужно установить значения vmin и vmax в hist2d.

hist2d(x,y,bins=40, norm=LogNorm(), vmin=1, vmax=1e4)
person murdertov    schedule 13.03.2014