Проблемы с нулями в matplotlib.colors.LogNorm - PullRequest
9 голосов
/ 26 февраля 2012

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

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

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

Histogram

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

Спасибо!

Ответы [ 3 ]

18 голосов
/ 01 февраля 2013

Вот альтернативный метод, который не требует, чтобы вы копировали свои данные, устанавливая значение 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 не могут быть должным образом нормализованы в журнале.поэтому они помечаются как «плохие», которые отображаются по-разному.Поведение по умолчанию - ничего не рисовать на этих пикселях.Вы также можете указать, какой цвет отрисовывать пиксели, находящиеся выше или ниже пределов цветовой карты (по умолчанию они рисуются как самый высокий / самый низкий цвет).

1 голос
/ 27 февраля 2012

Если вас устраивает цветовая шкала как есть, и вы просто хотите, чтобы значения 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)

производит

imagemimimum picture">

0 голосов
/ 13 марта 2014

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

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

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

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

hist2d(x,y,bins=40, norm=LogNorm(), vmin=1, vmax=1e4)
...