python - real - ¿Cómo extraer un subconjunto de un mapa de colores como un nuevo mapa de colores en matplotlib?
matplotlib python 3 (2)
Me gustaría utilizar un mapa de colores de matplotlib, por ejemplo, CMRmap. Pero no quiero usar el color "negro" al principio y el color "blanco" al final. Me interesa trazar mis datos usando los colores intermedios. Creo que las personas lo usan con bastante frecuencia, pero estaba buscando en Internet y no pude encontrar ninguna solución simple. Apreciaré si alguien sugiere alguna solución.
Recientemente estuve luchando con esto solo. Aquí hay algunas soluciones posibles:
Intente utilizar los argumentos de la palabra clave vmin
, vmax
en su función de trazado. Por ejemplo, supongamos que tiene datos entre 0 y 1, pero no le gustan los colores utilizados en los extremos del mapa de colores para 0 y 1.
import matplotlib.pyplot as plt
import matplotlib.cm as cm
my_cmap = cm.spectral_r
my_cmap.set_over(''c'')
my_cmap.set_under(''m'')
plt.pcolor(data, vmin=0.01, vmax=0.99, cmap=my_cmap)
Esto forzará que todo el mapa de colores se use para valores entre 0.01 y 0.99 y los valores superiores e inferiores serán cian y magenta respectivamente. Es posible que esto no resuelva su problema exactamente, pero podría ser útil si le gusta un mapa de colores en particular y desea tener colores adicionales en ambos extremos.
Si realmente desea cambiar el mapa de colores, mire la documentación aquí y para LinearSegmentedColormap aquí .
Primero,
import matplotlib.cm as cm
cdict = cm.get_cmap(''spectral_r'')._segmentdata
Esto devuelve un diccionario de todos los colores que componen el mapa de color. Sin embargo, es bastante complicado descubrir exactamente cómo alterar este diccionario. Este dict tiene tres teclas, red, green, blue
. cdict[key]
devuelve una lista de valores de la forma (x, y0, y1)
. Echemos un vistazo a dos elementos consecutivos de cdict[''red'']
:
((0.0, 0.0, 0.0)
(0.5, 1.0, 1.0),...
Lo que esto significa es que los datos con z
(suponiendo que estamos haciendo un pcolor
o imshow
) entre 0.0 y 0.5 tendrán el componente rojo del color rgb asociado con esos datos aumentará de 0.0 (no rojo) a 1.0 (rojo máximo) . Esto significa que para cambiar el color del mapa de colores, debe examinar cómo se interpolan cada uno de los tres componentes de rgb en la región del mapa de colores que le interesa. Solo asegúrese de que para cada color, el primero y el último comienzo de entrada con x=0
y x=1
respectivamente; debe cubrir todo el espectro de [0, 1].
Si desea cambiar los colores de inicio y fin, intente
import matplotlib.cm as cm
from matplotlib.colors import LinearSegmentedColormap
cdict = cm.get_cmap(''spectral_r'')._segmentdata
cdict[''red''][0] = (0, 0.5, 0.5) # x=0 for bottom color in colormap
cdict[''blue''][0] = (0, 0.5, 0.5) # y=0.5 gray
cdict[''green''][0] = (0, 0.5, 0.5) # y1=y for simple interpolation
cdict[''red''][-1] = (1, 0.5, 0.5) # x=1 for top color in colormap
cdict[''blue''][-1] = (1, 0.5, 0.5)
cdict[''green''][-1] = (1, 0.5, 0.5)
my_cmap = LinearSegmentedColormap(''name'', cdict)
Luego usa este cmap en tu función de trazado.
Lo que quería hacer era cambiar el gris al final del mapa de colores spectral_r
por el blanco puro. Esto fue logrado usando
# Using imports from above
cdict = matplotlib.cm.get_cmap(''spectral_r'')._segmentdata
cdict[''red''][0] = (0, 1, 1)
cdict[''green''][0] = (0, 1, 1)
cdict[''blue''][0] = (0, 1, 1)
my_cmap = LinearSegmentedColormap(''my_cmap'', cdict)
Los colores estáticos de color.LinearSegmentedColormap.from_list se pueden usar para crear nuevos LinearSegmentedColormaps. A continuación, muestro el mapa de colores original en 100 puntos entre 0.2 y 0.8:
cmap(np.linspace(0.2, 0.8, 100))
y usa estos colores para generar un nuevo mapa de color:
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100):
new_cmap = colors.LinearSegmentedColormap.from_list(
''trunc({n},{a:.2f},{b:.2f})''.format(n=cmap.name, a=minval, b=maxval),
cmap(np.linspace(minval, maxval, n)))
return new_cmap
arr = np.linspace(0, 50, 100).reshape((10, 10))
fig, ax = plt.subplots(ncols=2)
cmap = plt.get_cmap(''jet'')
new_cmap = truncate_colormap(cmap, 0.2, 0.8)
ax[0].imshow(arr, interpolation=''nearest'', cmap=cmap)
ax[1].imshow(arr, interpolation=''nearest'', cmap=new_cmap)
plt.show()
La gráfica de la izquierda muestra la imagen usando el mapa de color original (en este ejemplo, jet
). La gráfica de la derecha muestra la misma imagen usando new_cmap
.