Estoy usando matplotlib para trazar imágenes normalizadas de registro, pero me gustaría que los datos de imagen brutos originales se representen en la barra de colores en lugar de el intervalo [0-1]. Me da la sensación de que hay una manera más matplotlib'y de hacer esto al usar algún tipo de objeto de normalización y no transformar los datos de antemano ... en cualquier caso, podría haber valores negativos en la imagen sin formato.¿Cómo puedo dibujar un diagrama imshow log-normalizado con una barra de colores que represente los datos brutos en matplotlib
import matplotlib.pyplot as plt
import numpy as np
def log_transform(im):
'''returns log(image) scaled to the interval [0,1]'''
try:
(min, max) = (im[im > 0].min(), im.max())
if (max > min) and (max > 0):
return (np.log(im.clip(min, max)) - np.log(min))/(np.log(max) - np.log(min))
except:
pass
return im
a = np.ones((100,100))
for i in range(100): a[i] = i
f = plt.figure()
ax = f.add_subplot(111)
res = ax.imshow(log_transform(a))
# the colorbar drawn shows [0-1], but I want to see [0-99]
cb = f.colorbar(res)
He intentado usar cb.set_array, pero eso no parece hacer nada, y cb.set_clim, sino que cambia la escala de los colores por completo.
Así que al parecer me puede pasar una instancia de normalización en imshow y la imagen se normalizará para mí: res = ax.imshow (im, norma = mpl.colors.LogNorm()) Aún así, si adjunto una barra de color, los valores se establecen en vals normalizados en lugar de los datos brutos. –