Problèmes avec les zéros dans matplotlib.colors.lognorm
-
13-11-2019 - |
Question
Je trace un histogramme en utilisant
plt.imshow(hist2d, norm = LogNorm(), cmap = gray)
où hist2d
est une matrice de valeurs d'histogramme. Cela fonctionne bien sauf pour les éléments dans hist2d
qui sont nuls. En particulier, j'obtiens l'image suivante
mais aimerait que les patchs blancs soient noirs.
Merci!
La solution
Voici une autre méthode qui ne vous oblige pas à boucher avec vos données en définissant une valeur RVB pour les mauvais pixels.
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)
Le problème est que les poubelles avec 0
Je ne peux pas être correctement logique normalisé, de sorte qu'ils sont signalés comme «mauvais», qui sont cartographiés différemment. Le comportement par défaut consiste à ne rien dessiner sur ces pixels. Vous pouvez également spécifier la couleur à dessiner des pixels qui sont sur ou sous les limites de la carte de couleur (la valeur par défaut est de les dessiner comme la couleur la plus élevée / la plus basse).
Autres conseils
Si vous êtes satisfait de la mise à l'échelle des couleurs tels quels et que je veux simplement que les valeurs 0 soient noires, je changerais simplement la matrice d'entrée afin que les 0 soient remplacés par la plus petite valeur suivante:
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)
produit
mimimum picture">
Cela a-t-il été généré avec la fonction HIST2D Matplotlib?
Tout ce que vous avez à faire est de passer par la matrice et de définir une valeur de plancher arbitraire, puis assurez-vous de le tracer avec des limites fixes
for f in hist2d:
f += 1e-3
Ensuite, lorsque vous montrez la figure, tous les espaces seront désormais à la valeur du sol et apparaîtront sur le tracé lognormal. Cependant, si vous laissez HIST2D choisir automatiquement la mise à l'échelle pour vous, il voudra utiliser la valeur de plancher 1E-3 comme minimum. Pour éviter cela, vous devez définir les valeurs VMIN et VMAX dans HIST2D
hist2d(x,y,bins=40, norm=LogNorm(), vmin=1, vmax=1e4)