¿Cómo puedo dibujar un gráfico imshow log normalizado con una barra de color que representa los datos en bruto en matplotlib?

Estoy utilizando matplotlib para trazar imágenes normalizadas de registro, pero me gustaría que los datos de imagen sin procesar originales se representen en la barra de colores en lugar del intervalo [0-1]. Me da la sensación de que hay una forma más sencilla de hacer esto usando algún tipo de objeto de normalización y no transformando los datos de antemano … en cualquier caso, podría haber valores negativos en la imagen en bruto.

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, pero eso vuelve a escalar los colores completamente.

¡Sí hay! Utilice LogNorm . Aquí hay un extracto de código de una utilidad que escribí para mostrar matrices de confusión en una escala de registro.

 from pylab import figure, cm from matplotlib.colors import LogNorm # C = some matrix f = figure(figsize=(6.2,5.6)) ax = f.add_axes([0.17, 0.02, 0.72, 0.79]) axcolor = f.add_axes([0.90, 0.02, 0.03, 0.79]) im = ax.matshow(C, cmap=cm.gray_r, norm=LogNorm(vmin=0.01, vmax=1)) t = [0.01, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0] f.colorbar(im, cax=axcolor, ticks=t, format='$%.2f$') f.show() 

Si solo desea que la imagen se normalice con el registro (para mejorar los detalles), pero no los datos (para preservar los valores físicos), debe aplicar la transformación en el mapa de color en sí. Puede hacerlo con la función cmap_map () que se encuentra en el libro de recetas: https://scipy-cookbook.readthedocs.io/items/Matplotlib_ColormapTransformations.html