¿Cómo crear un mapa de calor en python que varía de verde a rojo?

Estoy tratando de trazar las relaciones de registro del rango -3 a 3 y quiero que las relaciones negativas sean verdes y las positivas sean rojas, con una relación de registro de 0 (centro) que sea de color blanco. Ninguno de los esquemas de color preexistentes en matplotlib ofrece esta opción, y no he podido averiguar cómo generar un gradiente agradable manualmente.

puedes crear el tuyo usando un LinearSegmentedColormap . Me gusta configurar los canales rojo y verde en algo menos de 1.0 en los límites superior e inferior para que los colores no sean demasiado shinys (aquí utilicé 0.8). Ajústelo a su gusto.

Vea el ejemplo custom_cmap en el sitio web matplotlib para más detalles.

Aquí hay un ejemplo de trabajo:

 import matplotlib.pyplot as plt import matplotlib.colors as colors import numpy as np # This dictionary defines the colormap cdict = {'red': ((0.0, 0.0, 0.0), # no red at 0 (0.5, 1.0, 1.0), # all channels set to 1.0 at 0.5 to create white (1.0, 0.8, 0.8)), # set to 0.8 so its not too bright at 1 'green': ((0.0, 0.8, 0.8), # set to 0.8 so its not too bright at 0 (0.5, 1.0, 1.0), # all channels set to 1.0 at 0.5 to create white (1.0, 0.0, 0.0)), # no green at 1 'blue': ((0.0, 0.0, 0.0), # no blue at 0 (0.5, 1.0, 1.0), # all channels set to 1.0 at 0.5 to create white (1.0, 0.0, 0.0)) # no blue at 1 } # Create the colormap using the dictionary GnRd = colors.LinearSegmentedColormap('GnRd', cdict) # Make a figure and axes fig,ax = plt.subplots(1) # Some fake data in the range -3 to 3 dummydata = np.random.rand(5,5)*6.-3. # Plot the fake data p=ax.pcolormesh(dummydata,cmap=GnRd,vmin=-3,vmax=3) # Make a colorbar fig.colorbar(p,ax=ax) plt.show() 

introduzca la descripción de la imagen aquí

¿Qué hay de lo siguiente que usa LinearSegmentedColormap :

 import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import LinearSegmentedColormap cmapGR = LinearSegmentedColormap( 'GreenRed', { 'red': ((0.0, 0.0, 0.0), (0.5, 1.0, 1.0), (1.0, 1.0, 1.0)), 'green':((0.0, 1.0, 1.0), (0.5, 1.0, 1.0), ( 1.0, 0.0, 0.0)), 'blue': ((0.0, 0.0, 0.0), (0.5, 1.0, 1.0), (1.0, 0.0, 0.0)) },) plt.imshow(np.array([np.arange(200) for i in range(200)]), cmap=cmapGR) plt.show() 

Produce lo siguiente introduzca la descripción de la imagen aquí

Consulte, por ejemplo, http://matplotlib.org/examples/pylab_examples/custom_cmap.html para más usos y otros ejemplos.

El uso del método from_list parece más intuitivo que algunas de las otras respuestas aquí.

 from matplotlib.colors import LinearSegmentedColormap cmap=LinearSegmentedColormap.from_list('rg',["r", "w", "g"], N=256) 

introduzca la descripción de la imagen aquí

O para una afinación más sofisticada:

 from matplotlib.colors import LinearSegmentedColormap c = ["darkred","red","lightcoral","white", "palegreen","green","darkgreen"] v = [0,.15,.4,.5,0.6,.9,1.] l = list(zip(v,c)) cmap=LinearSegmentedColormap.from_list('rg',l, N=256) 

introduzca la descripción de la imagen aquí