Mapa de colores personalizado usando Python Matplotlib
- Use Matplotlib para crear un mapa de colores personalizado en Python
-
Utilice el método
get_cmap()
de Matplotlib para acceder a mapas de colores y sus valores en Python -
Use el atributo
colors
del objetoListedColormap
para crear un mapa de colores listado personalizado en Python - ¿Cómo crear un mapa de colores segmentado lineal personalizado en Python?
- Conclusión
Los mapas de colores son una de las formas más efectivas de mostrar variaciones entre valores continuos y discretos en un gráfico. Este artículo discutirá la creación de un mapa de colores personalizado usando Matplotlib en Python.
Use Matplotlib para crear un mapa de colores personalizado en Python
La biblioteca matplotlib
ofrece varios mapas de colores integrados. Sin embargo, suponga que desea manipular mapas de colores o crear mapas de colores personalizados. En ese caso, puedes hacerlo usando la clase ListedColormap
o la clase LinearSegmentedColormap
definida en la biblioteca matplotlib
.
Antes de crear mapas de colores personalizados, analicemos primero cómo podemos acceder a los valores en los mapas de colores de Matplotlib para comprender la implementación de los mapas de colores. Nos permitirá crear mapas de color personalizados de nuestra elección.
Utilice el método get_cmap()
de Matplotlib para acceder a mapas de colores y sus valores en Python
Hay varios mapas de colores definidos en el módulo Matplotlib. A cada mapa de colores se le ha asignado su nombre único. Podemos acceder a un mapa de colores utilizando el método get_cmap()
en el módulo cm
de la biblioteca matplotlib
.
La sintaxis del método get_cmap()
es la siguiente.
matplotlib.cm.get_cmap(name=None, lut=None)
- El parámetro
name
acepta el nombre del mapa de colores como una cadena o un objetoColormap
definido en el módulomatplotlib.colors
. Tiene un valor por defecto deNone
. Si no especificamos ninguna entrada para el nombre del parámetro, el métodoget_cmap()
devuelve el mapa de coloresviridis
. - Si un mapa de colores con el nombre especificado está definido en la biblioteca Matplotlib, el método
get_cmap()
devuelve una instancia deMapa de colores
. - El valor por defecto del parámetro
lut
esNone
. Silut
no esNone
, debería ser un número entero que especifique el número de colores en la lista utilizada para definir el mapa de colores. - Si el
name
no es un mapa de colores válido ylut
no esNone
, se vuelve a muestrear el mapa de colores para introducir valoreslut
en la tabla de búsqueda.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
cm.get_cmap("viridis", 8)
Producción:
El código anterior se ejecutó en el shell interactivo de Jupyter Notebook. Si intenta ejecutarlo en un IDE diferente, es posible que obtenga o no la imagen de arriba como salida.
El mapa de colores devuelto por el método get_cmap()
es invocable. Cuando pasamos un valor entre 0 y 1 al objeto colormap, devuelve un valor RGBA.
Puedes observar esto en este ejemplo.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
viridis = cm.get_cmap("viridis", 8)
print(viridis(0.56))
Producción :
(0.122312, 0.633153, 0.530398, 1.0)
Use el atributo colors
del objeto ListedColormap
para crear un mapa de colores listado personalizado en Python
Para crear un ListedColormap
personalizado, veamos primero cómo se almacenan los colores en un ListedColormap
. Para ello, podemos utilizar el atributo colors
del objeto ListedColormap
.
Por ejemplo, viridis
es un ListedColormap
. Podemos observar los valores de color usando el atributo colors del mapa de colores viridis
, como se muestra en el siguiente ejemplo.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
viridis = cm.get_cmap("viridis", 8)
print(viridis.colors)
Producción :
[[0.267004 0.004874 0.329415 1. ]
[0.275191 0.194905 0.496005 1. ]
[0.212395 0.359683 0.55171 1. ]
[0.153364 0.497 0.557724 1. ]
[0.122312 0.633153 0.530398 1. ]
[0.288921 0.758394 0.428426 1. ]
[0.626579 0.854645 0.223353 1. ]
[0.993248 0.906157 0.143936 1. ]]
Aquí puede ver que los colores se almacenan en una matriz de Nx4
. También puede acceder al número especificado de filas del ListedColormap
llamando al nombre del mapa de colores con la secuencia requerida como argumento de entrada, como se muestra a continuación.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
viridis = cm.get_cmap("viridis", 8)
print(viridis(range(0, 8)))
Producción :
[[0.267004 0.004874 0.329415 1. ]
[0.275191 0.194905 0.496005 1. ]
[0.212395 0.359683 0.55171 1. ]
[0.153364 0.497 0.557724 1. ]
[0.122312 0.633153 0.530398 1. ]
[0.288921 0.758394 0.428426 1. ]
[0.626579 0.854645 0.223353 1. ]
[0.993248 0.906157 0.143936 1. ]]
Como puede observar, un ListedColormap
se representa mediante una lista. Entonces, para crear un ListedColormap
personalizado en Python, tendremos que crear una lista que represente los colores del mapa de colores.
Use nombres de colores para crear un mapa de colores listado personalizado en Python
Podemos crear un mapa de colores personalizado utilizando el método ListedColormap()
. La sintaxis del método ListedColormap()
es la siguiente.
matplotlib.colors.ListedColormap(colors, name="from_list", N=None)
- El parámetro
colors
toma una matriz o lista de nombres de colores o valores numéricos que representan valores RGBA. - El parámetro
name
se utiliza para dar un nombre específico al mapa de colores personalizado creado. Tiene un valor predeterminadofrom_list
. - El parámetro N indica el número de entradas en el mapa de colores. Tiene un valor por defecto de
None
. Cuando N tiene el valor Ninguno, debe haber una entrada de mapa de colores para cada color en la lista decolores
.
Para crear un mapa de colores personalizado utilizando el método ListedColormap()
y una lista de colores, puede pasar nombres de cuatro colores al método ListedColormap()
. Devolverá un objeto Colormap
.
Después de eso, puede usar el objeto Colormap
para trazar los datos, como se muestra a continuación.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cmap = ListedColormap(["darkorange", "gold", "lawngreen", "lightseagreen"])
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()
Producción:
Use valores RGBA para crear un mapa de colores listado personalizado en Python
En lugar de usar los nombres de los colores, puede usar las matrices con valores RGBA para crear el mapa de colores como se muestra a continuación.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorarray = [
[0.57647055, 0.4116, 0.27107143, 1],
[0, 0.4116, 0.27107143, 1],
[0.57647055, 0, 0.27107143, 1],
]
cmap = ListedColormap(colorarray)
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()
Producción:
¿Cómo crear un mapa de colores segmentado lineal personalizado en Python?
Antes de crear mapas de colores segmentados lineales personalizados, observemos cómo se almacenan los valores de color en un mapa de colores segmentado lineal.
Los mapas de color segmentados lineales no tienen el atributo color
. Sin embargo, podemos llamar al nombre del mapa de colores con la secuencia requerida como argumento de entrada para observar los valores de color.
Por ejemplo, podemos ver los valores de color del mapa de colores cobre
de la siguiente manera.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
copper = cm.get_cmap("copper", 8)
print(copper(range(0, 8)))
Producción :
[[0. 0. 0. 1. ]
[0.17647055 0.1116 0.07107143 1. ]
[0.35294109 0.2232 0.14214286 1. ]
[0.52941164 0.3348 0.21321429 1. ]
[0.70588219 0.4464 0.28428571 1. ]
[0.88235273 0.558 0.35535714 1. ]
[1. 0.6696 0.42642857 1. ]
[1. 0.7812 0.4975 1. ]]
¿Qué es cdict
en Matplotlib en Python?
La clase LinearSegmentedColormap
utiliza puntos de anclaje entre los que se interpolan los valores RGBA para definir un mapa de colores segmentado lineal.
- Cada punto de anclaje se especifica como una fila en una matriz de la forma
[x[i] yleft[i] yright[i]]
. Lax[i]
es el ancla, yyleft[i]
yyright[i]
son los valores de color a ambos lados del punto de ancla. - Si el mapa de colores tiene discontinuidades en los puntos de anclaje,
yleft[i]
yyright[i]
tendrán valores diferentes. De lo contrario,yleft[i]
yyright[i]
tienen el mismo valor. - Los puntos de anclaje se almacenan en un diccionario de colores, a menudo llamado
cdict
. Las claves del diccionario sonred
,green
yblue
, y los valores correspondientes son puntos de anclaje especificados como filas en una matriz de la forma[x[i] yleft[i] yright[i]]
. En cada entrada de uncdict
, el valor dex[i]
debe aumentar monótonamente de 0 a 1.
Puede crear un diccionario de colores de la siguiente manera.
cdict = {
"blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
"red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
"green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}
Use puntos de anclaje para crear un mapa de colores segmentado lineal personalizado en Python
Después de crear un cdict
, puede usar el método LinearSegmentedColormap()
para crear un mapa de colores segmentado lineal. La sintaxis del método LinearSegmentedColormap()
es la siguiente.
matplotlib.colors.LinearSegmentedColormap(name, segmentdata, N=256, gamma=1.0)
- El parámetro
name
denota el nombre del mapa de colores. Debe ser una cadena. - El parámetro
segmentdata
toma elcdict
como argumento de entrada. - El parámetro N indica el número de puntos en la tabla de búsqueda del mapa de colores. Tiene un valor predeterminado de 256.
- El parámetro
gamma
denota la escala utilizada para las coordenadas x. Tiene un valor predeterminado de 1.0.
Como se muestra a continuación, podemos crear un mapa de colores segmentado lineal utilizando el método LinearSegmentedColormap()
.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cdict = {
"blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
"red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
"green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}
newcmp = LinearSegmentedColormap("testCmap", segmentdata=cdict, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()
Producción:
Use nombres de colores para crear un mapa de colores segmentado lineal personalizado en Python
En lugar de usar un cdict
, también podemos usar una lista de colores para crear un mapa de colores personalizado. Para ello, podemos utilizar el método LinearSegmentedColormap.from_list()
. La sintaxis del método from_list()
es la siguiente.
from_list(name, colors, N=256, gamma=1.0)
Aquí, el parámetro colors
toma una lista de colores como argumento de entrada. Todos los demás parámetros son similares al método LinearSegmentedColormap()
.
Puede crear un mapa de colores segmentado lineal utilizando el método from_list()
de la siguiente manera.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorlist = ["darkorange", "gold", "lawngreen", "lightseagreen"]
newcmp = LinearSegmentedColormap.from_list("testCmap", colors=colorlist, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()
Producción:
Conclusión
Este artículo discutió diferentes formas de crear un mapa de colores personalizado usando Matplotlib en Python. Hemos creado mapas de colores enumerados y mapas de colores segmentados lineales y hemos trazado algunos datos usando los mapas de colores.
Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.
GitHub