Combinando dos mapas de matplotlib

Me gustaría fusionar dos mapas de colores en uno, de modo que pueda usar un cmap para los valores negativos y el otro para los valores positivos.

En este momento lo hago con arreglos enmascarados y graficando una imagen con un cmap y la otra imagen con la otra, dando como resultado:

introduzca la descripción de la imagen aquí

con los siguientes datos

 dat = np.random.rand(10,10) * 2 - 1 pos = np.ma.masked_array(dat, dat=0) 

gist_heat_r pos con gist_heat_r y neg con binary .

Me gustaría tener una única barra de colores con los cmap combinados, por lo que este no es el enfoque correcto para mí.

Entonces, ¿cómo tomo dos cmaps existentes y los cmaps en uno?

EDIT: Admito, esto es un duplicado, pero la respuesta que se da es mucho más clara aquí. También las imágenes de ejemplo lo hacen más claro.

Los mapas de colores son básicamente funciones de interpolación a las que puede llamar. Asignan valores del intervalo [0,1] a los colores. Así que solo puedes muestrear colores de ambos mapas y luego combinarlos:

 import numpy as np import matplotlib.pyplot as plt import matplotlib.colors as mcolors data = np.random.rand(10,10) * 2 - 1 # sample the colormaps that you want to use. Use 128 from each so we get 256 # colors in total colors1 = plt.cm.binary(np.linspace(0., 1, 128)) colors2 = plt.cm.gist_heat_r(np.linspace(0, 1, 128)) # combine them and build a new colormap colors = np.vstack((colors1, colors2)) mymap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors) plt.pcolor(data, cmap=mymap) plt.colorbar() plt.show() 

Resultado: introduzca la descripción de la imagen aquí

NOTA : entiendo que podría tener necesidades específicas para esto, pero en mi opinión, este no es un buen enfoque: ¿cómo distinguirá -0.1 de 0.9? -0.9 a partir de 0.1?

Una forma de evitar esto es muestrear los mapas solo de ~ 0.2 a ~ 0.8 (por ejemplo: colors1 = plt.cm.binary(np.linspace(0.2, 0.8, 128)) ) para que no colors1 = plt.cm.binary(np.linspace(0.2, 0.8, 128)) al negro :

introduzca la descripción de la imagen aquí