python - example - matplotlib imshow-normalización de color por defecto
matplotlib title position (2)
Siempre he tenido problemas con mis mapas de color cuando uso imshow
, algunos colores parecen volverse negros. Finalmente me he dado cuenta de que imshow
parece, por defecto, normalizar la matriz de valores de punto flotante que le doy.
Hubiera esperado que una matriz como [[0,0.25],[0.5,0.75]]
muestre los colores apropiados del mapa, correspondientes a esos valores absolutos, pero el 0.75 se interpretará como un 1. En el caso extremo, una matriz N x N de 0.2 (por ejemplo), solo produciría un gran cuadrado negro, en lugar de lo que uno esperaría que 0.2 corresponda en el mapa de color (quizás un 20% de gris).
¿Hay alguna manera de prevenir este comportamiento? Es particularmente molesto cuando los mapas de color personalizados tienen muchas discontinuidades, un pequeño cambio en la escala podría hacer que todos los colores cambien por completo.
La solución aceptada no funciona siempre. Consideremos por ejemplo este caso:
data = [[0, 0.0025], [0.005, 0.0075]] fig, ax = plt.subplots() im = ax.imshow(data, cmap=plt.get_cmap(''hot''), interpolation=''nearest'', vmin=0, vmax=1) fig.colorbar(im) plt.show()
Entonces, no ves mucho.
En estos casos, la solución más robusta está utilizando la normalización mín.-Máx.
import numpy as np data = np.array([[0, 0.0025], [0.005, 0.0075]]) data = (data - data.min()) / abs(data.max() - data.min()) fig, ax = plt.subplots() im = ax.imshow(data, cmap=plt.get_cmap(''hot''), interpolation=''nearest'') fig.colorbar(im) plt.show()
Simplemente especifique vmin=0, vmax=1
.
De forma predeterminada, imshow
normaliza los datos a su mínimo y máximo. Puede controlar esto con los argumentos vmin
y vmax
o con el argumento de la norm
(si desea una escala no lineal).
Como un ejemplo rápido:
import matplotlib.pyplot as plt
data = [[0, 0.25], [0.5, 0.75]]
fig, ax = plt.subplots()
im = ax.imshow(data, cmap=plt.get_cmap(''hot''), interpolation=''nearest'',
vmin=0, vmax=1)
fig.colorbar(im)
plt.show()