ticks logarithmic examples change python matplotlib colorbar

python - logarithmic - matplotlib colorbar range



¿Cómo puedo crear una barra de color estándar para una serie de tramas en python? (4)

Esto solo responde la mitad de la pregunta, o más bien comienza una nueva. Si cambias

data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]

a

data *= np.array([2.0, 1.0, 1.5, 0.5])[:,None,None]

su barra de color irá de 0 a 0.5, que en este caso es azul oscuro a azul ligeramente más claro y no cubrirá todo el rango (0 a 2). La barra de colores solo mostrará los colores de la última imagen o contorno independientemente de vmin y vmax .

Estoy usando matplotlib para trazar algunos datos en python y las tramas requieren una barra de color estándar. Los datos consisten en una serie de matrices NxM que contienen información de frecuencia para que un diagrama simple de imshow () proporcione un histograma 2D con frecuencia de descripción del color. Cada matriz contiene datos en rangos diferentes, pero superpuestos. Imshow normaliza los datos en cada matriz en el rango 0-1, lo que significa que, por ejemplo, la gráfica de la matriz A, aparecerá idéntica a la gráfica de la matriz 2 * A (aunque la barra de color mostrará el doble de los valores). Lo que me gustaría es que el color rojo, por ejemplo, corresponda a la misma frecuencia en todos los trazados. En otras palabras, una sola barra de color sería suficiente para todas las tramas. Cualquier sugerencia sería muy apreciada.


La solución más fácil es llamar a clim (lower_limit, upper_limit) con los mismos argumentos para cada parcela.


No estaba contento con las soluciones que sugerían configurar manualmente vmin y vmax , así que decidí leer los límites de cada gráfico y configurar automáticamente vmin y vmax .

El siguiente ejemplo muestra tres gráficos de muestras tomadas de distribuciones normales con un valor medio creciente.

import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import ImageGrid import numpy as np numberOfPlots = 3 data = [] for i in range(numberOfPlots): mean = i data.append(np.random.normal(mean, size=(100,100))) fig = plt.figure() grid = ImageGrid(fig, 111, nrows_ncols=(1,numberOfPlots), cbar_mode=''single'') ims = [] for i in range(numberOfPlots): ims.append(grid[i].imshow(data[i])) grid[i].set_title("Mean = " + str(i)) clims = [im.get_clim() for im in ims] vmin = min([clim[0] for clim in clims]) vmax = max([clim[1] for clim in clims]) for im in ims: im.set_clim(vmin=np.floor(vmin),vmax=np.ceil(vmax)) grid[0].cax.colorbar(ims[0]) # with cbar_mode="single", cax attribute of all axes are identical fig.show()


No robar la respuesta de @ianilis, pero quería agregar un ejemplo ...

Hay varias formas, pero la más simple es simplemente especificar vmin y vmax kwargs para imshow . Alternativamente, puede hacer una instancia matplotlib.cm.Colormap y especificarla, pero eso es más complicado de lo necesario para casos simples.

Aquí hay un ejemplo rápido con una barra de color única para todas las imágenes:

import numpy as np import matplotlib.pyplot as plt # Generate some data that where each slice has a different range # (The overall range is from 0 to 2) data = np.random.random((4,10,10)) data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None] # Plot each slice as an independent subplot fig, axes = plt.subplots(nrows=2, ncols=2) for dat, ax in zip(data, axes.flat): # The vmin and vmax arguments specify the color limits im = ax.imshow(dat, vmin=0, vmax=2) # Make an axis for the colorbar on the right side cax = fig.add_axes([0.9, 0.1, 0.03, 0.8]) fig.colorbar(im, cax=cax) plt.show()