diverging color python matplotlib

python - diverging - matplotlib scatter color



Combina dos mapas de color matplotlib (1)

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

Por el momento lo hago con matrices enmascaradas y trazando una imagen con un cmap y la otra imagen con el otro, lo que resulta en:

con los siguientes datos

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

gist_heat_r pos con gist_heat_r y neg con binary .

Me gustaría tener una barra de color única 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?

EDITAR: Lo admito, este 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 color son básicamente funciones de interpolación a las que puedes llamar. Ellos mapean valores del intervalo [0,1] a colores. Entonces puedes simplemente tomar muestras de 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:

NOTA : entiendo que puede 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 desde 0.1?

Una forma de evitar esto es muestrear los mapas solo desde ~ 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)) hasta el negro :