Establecer rango de barra de colores en matplotlib

Tengo el siguiente código:

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() 

Entonces, esto produce una gráfica 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 el máximo de v. Me gustaría forzar el rango de colores entre 0 y 1.

Pensé en usar:

 plt.axis(...) 

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

Editar:

Para mayor claridad, digamos que tengo un gráfico cuyos valores varían (0 … 0.3) y otro gráfico cuyos valores (0.2 … 0.8).

En ambos gráficos, desearé que el rango de la barra de colores sea (0 … 1). En ambos gráficos, quiero que este rango de color sea idéntico al usar 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 aparecerán en el gráfico, pero sí en la tecla de la barra de colores en el lado. En el otro, todos los colores entre 0 y 0.2, y entre 0.8 y 1 no se mostrarán en el gráfico, sino en la barra de colores en el lado.

Usar vmin y vmax fuerza el rango para los colores. Aquí hay un ejemplo:

introduzca la descripción de la imagen aquí

 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() 

Utilice la función CLIM (equivalente a la función CAXIS en MATLAB):

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

No estoy seguro de si esta es la solución más elegante (esto es lo que usé), pero podría escalar sus datos al 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 límites diferentes puede controlar el rango y la leyenda de la barra de colores. En este ejemplo, solo se muestra el rango entre -0.5 y 1.5 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 usted registra antes de la escala).

Entonces, en lugar de escalar el mapa de colores, escala los datos y ajusta la barra de colores a eso.

Usando el entorno figure y .set_clim ()

Podría ser más fácil y segura esta alternativa si tiene varias plots:

 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) ) data1 = np.clip(data,0,6) data2 = np.clip(data,-6,0) vmin = np.min(np.array([data,data1,data2])) vmax = np.max(np.array([data,data1,data2])) fig = plt.figure() ax = fig.add_subplot(131) mesh = ax.pcolormesh(data, cmap = cm) mesh.set_clim(vmin,vmax) ax1 = fig.add_subplot(132) mesh1 = ax1.pcolormesh(data1, cmap = cm) mesh1.set_clim(vmin,vmax) ax2 = fig.add_subplot(133) mesh2 = ax2.pcolormesh(data2, cmap = cm) mesh2.set_clim(vmin,vmax) # Visualizing colorbar part -start fig.colorbar(mesh,ax=ax) fig.colorbar(mesh1,ax=ax1) fig.colorbar(mesh2,ax=ax2) fig.tight_layout() # Visualizing colorbar part -end plt.show() 

introduzca la descripción de la imagen aquí

Una barra de colores

La mejor alternativa es utilizar una barra de un solo color para toda la ttwig. Hay diferentes maneras de hacerlo, este tutorial es muy útil para entender la mejor opción. Prefiero esta solución que simplemente puede copiar y pegar en lugar de la parte de código de barra de colores de visualización anterior.

 fig.subplots_adjust(bottom=0.1, top=0.9, left=0.1, right=0.8, wspace=0.4, hspace=0.1) cb_ax = fig.add_axes([0.83, 0.1, 0.02, 0.8]) cbar = fig.colorbar(mesh, cax=cb_ax) 

introduzca la descripción de la imagen aquí

PD

Yo sugeriría usar pcolormesh lugar de pcolor porque es más rápido (más información aquí ).