2010-07-30 54 views
87

Tengo el siguiente código:Conjunto de Colorbar rango en matplotlib

import matplotlib.pyplot as plt 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

plt.clf() 
plt.pcolor(X, Y, v, cmap=cm) 
plt.loglog() 
plt.xlabel('X Axis') 
plt.ylabel('Y Axis') 

plt.colorbar() 
plt.show() 

Así que esto produce un gráfico de los valores 'v' en los ejes X vs Y, utilizando el mapa de colores especificado. Los ejes X e Y son perfectos, pero el mapa de colores se extiende entre el mínimo y máximo de v me gustaría forzar el mapa de colores para variar entre 0 y 1.

pensé usando:.

plt.axis(...) 

Para establecer los rangos de los ejes, pero esto solo toma argumentos para el mínimo y el máximo de X e Y, no el mapa de colores.

Editar:

Para mayor claridad, supongamos que tengo un gráfico cuyos valores variar (0 ... 0,3), y otro gráfico cuyos valores (0.2 ... 0.8).

En ambos gráficos, querré que el rango de la barra de color sea (0 ... 1). En ambos gráficos, quiero que este rango de color sea idéntico usando el rango completo de cdict anterior (por lo que 0.25 en ambos gráficos será del mismo color). En el primer gráfico, todos los colores entre 0.3 y 1.0 no se mostrarán en el gráfico, sino que aparecerán en la barra de color de la barra lateral. En el otro, todos los colores entre 0 y 0.2, y entre 0.8 y 1 no aparecerán en el gráfico, sino que aparecerán en la barra de color al costado.

Respuesta

114

El uso de vmin y vmax fuerza el alcance de los colores. He aquí un ejemplo:

enter image description here

import matplotlib as m 
import matplotlib.pyplot as plt 
import numpy as np 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

x = np.arange(0, 10, .1) 
y = np.arange(0, 10, .1) 
X, Y = np.meshgrid(x,y) 

data = 2*(np.sin(X) + np.sin(3*Y)) 

def do_plot(n, f, title): 
    #plt.clf() 
    plt.subplot(1, 3, n) 
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4) 
    plt.title(title) 
    plt.colorbar() 

plt.figure() 
do_plot(1, lambda x:x, "all") 
do_plot(2, lambda x:np.clip(x, -4, 0), "<0") 
do_plot(3, lambda x:np.clip(x, 0, 4), ">0") 
plt.show() 
10

No estoy seguro si esta es la solución más elegante (esto es lo que he usado), pero se puede escalar sus datos en el rango entre 0 a 1 y luego modificar la barra de colores:

import matplotlib as mpl 
... 
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5) 
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm, 
         norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5)) 
cbar.set_clim(-2.0, 2.0) 

Con los dos diferentes límites puede controlar el rango y la leyenda de la barra de colores. En este ejemplo, solo el rango entre -0.5 a 1.5 se muestra en la barra, mientras que el mapa de colores cubre de -2 a 2 (por lo que este podría ser su rango de datos, que registrará antes de escalar).

Por lo tanto, en lugar de escalar el mapa de colores, puede escalar sus datos y ajustar la barra de colores a eso.

+1

Creo que eso es hacer algo sutilmente diferente ... lo siento, probablemente no era lo suficientemente precisa en mi pregunta. Su solución escalará los colores de modo que lo que solía representar el valor 1.0 representará ahora el valor máximo en mis datos. La barra de color mostrará 0..1 cuando lo necesite (con vmin = 0, vmax = 1), pero todo lo que esté por encima de este valor máximo será del mismo color ... – Paul

+1

... He actualizado mi pregunta para mostrar qué Lo busco más claramente. Lo siento si era demasiado vago. – Paul

+0

¡Tu respuesta me ayudó a resolver mi problema, sin embargo! – punyidea

39

Uso del CLIM función (equivalente a CAXIS función en MATLAB):

plt.pcolor(X, Y, v, cmap=cm) 
plt.clim(-4,4) 
plt.show() 
+1

Creo que clim() escala los ejes de color, pero los colores cambian de valor. El punto en una cierta fracción a lo largo de la escala será del mismo color sea cual sea la escala, pero el valor que representa cambiará. – Paul

Cuestiones relacionadas