2011-10-24 14 views
34

I usando matplotlib para trazar algunos datos en python y los gráficos 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.¿Cómo puedo crear una barra de color estándar para una serie de gráficos en python

+1

Prefiero utilizar matshow() o pcolor() porque imshow() suaviza la matriz cuando se muestra haciendo la interpretación más difícil. Entonces, a menos que la matriz sea de hecho una imagen, sugiero que pruebes las otras dos. – ianalis

+2

@inalis - Puede especificar 'interpolation = 'nearest'' cuando use' imshow' si no desea la interpolación. 'pcolor' es mucho más lento que' imshow' para arreglos grandes, por lo que a menudo es mejor usar 'imshow' para matrices de gran tamaño. Por otro lado, 'pcolor' da salida vectorial, que a veces puede ser muy útil. –

+0

posible duplicado de [Subplots Matplotlib 2, 1 barra de colores] (http://stackoverflow.com/questions/13784201/matplotlib-2-subplots-1-colorbar) –

Respuesta

8

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

+4

O simplemente pase los 'kremgs' vmin' y 'vmax' a' imshow'. –

68

no robar @ respuesta de ianilis, pero quería añadir un ejemplo ...

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

Aquí está un ejemplo rápido con una sola barra de colores 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() 

enter image description here

1

Esto sólo la mitad de la respuesta a la pregunta, o más bien comienza una nueva. Si cambia

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 colores va a ir de 0 a 0,5, que en este caso es de color azul oscuro a ligeramente azul más claro y no cubrirá toda la gama (0 a 2) . La barra de colores solo mostrará los colores de la última imagen o contorno, independientemente de vmin y vmax.

Cuestiones relacionadas