Mapa de colores personalizado usando Python Matplotlib

Aditya Raj 30 enero 2023
  1. Use Matplotlib para crear un mapa de colores personalizado en Python
  2. Utilice el método get_cmap() de Matplotlib para acceder a mapas de colores y sus valores en Python
  3. Use el atributo colors del objeto ListedColormap para crear un mapa de colores listado personalizado en Python
  4. ¿Cómo crear un mapa de colores segmentado lineal personalizado en Python?
  5. Conclusión
Mapa de colores personalizado usando Python Matplotlib

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)
  1. El parámetro name acepta el nombre del mapa de colores como una cadena o un objeto Colormap definido en el módulo matplotlib.colors. Tiene un valor por defecto de None. Si no especificamos ninguna entrada para el nombre del parámetro, el método get_cmap() devuelve el mapa de colores viridis.
  2. Si un mapa de colores con el nombre especificado está definido en la biblioteca Matplotlib, el método get_cmap() devuelve una instancia de Mapa de colores.
  3. El valor por defecto del parámetro lut es None. Si lut no es None, debería ser un número entero que especifique el número de colores en la lista utilizada para definir el mapa de colores.
  4. Si el name no es un mapa de colores válido y lut no es None, se vuelve a muestrear el mapa de colores para introducir valores lut 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:

mapa de colores matplotlib - viridis

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)
  1. El parámetro colors toma una matriz o lista de nombres de colores o valores numéricos que representan valores RGBA.
  2. El parámetro name se utiliza para dar un nombre específico al mapa de colores personalizado creado. Tiene un valor predeterminado from_list.
  3. 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 de colores.

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 nombres de colores para crear un mapa de colores listado personalizado en Python

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:

Use valores RGBA para crear un mapa de colores listado personalizado en Python

¿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.

  1. Cada punto de anclaje se especifica como una fila en una matriz de la forma [x[i] yleft[i] yright[i]]. La x[i] es el ancla, y yleft[i] y yright[i] son los valores de color a ambos lados del punto de ancla.
  2. Si el mapa de colores tiene discontinuidades en los puntos de anclaje, yleft[i] y yright[i] tendrán valores diferentes. De lo contrario, yleft[i] y yright[i] tienen el mismo valor.
  3. Los puntos de anclaje se almacenan en un diccionario de colores, a menudo llamado cdict. Las claves del diccionario son red, green y blue, 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 un cdict, el valor de x[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)
  1. El parámetro name denota el nombre del mapa de colores. Debe ser una cadena.
  2. El parámetro segmentdata toma el cdict como argumento de entrada.
  3. 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.
  4. 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 puntos de anclaje para crear un mapa de colores segmentado lineal personalizado en Python

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:

Use nombres de colores para crear un mapa de colores segmentado lineal personalizado en Python

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.

Autor: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

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

Artículo relacionado - Matplotlib Color