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 :