Проблеми с нули в 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