Palette de couleurs personnalisée à l'aide de Python Matplotlib

Aditya Raj 30 janvier 2023
  1. Utilisez Matplotlib pour créer une palette de couleurs personnalisée en Python
  2. Utilisez la méthode get_cmap() de Matplotlib pour accéder aux cartes de couleurs et à leurs valeurs en Python
  3. Utilisez l’attribut colors de l’objet ListedColormap pour créer une palette de couleurs personnalisée en Python
  4. Comment créer une palette de couleurs segmentée linéaire personnalisée en Python ?
  5. Conclusion
Palette de couleurs personnalisée à l'aide de Python Matplotlib

Les palettes de couleurs sont l’un des moyens les plus efficaces de montrer les variations entre les valeurs continues et discrètes dans un graphique. Cet article traite de la création d’une palette de couleurs personnalisée à l’aide de Matplotlib en Python.

Utilisez Matplotlib pour créer une palette de couleurs personnalisée en Python

La bibliothèque matplotlib propose diverses palettes de couleurs intégrées. Cependant, supposons que vous souhaitiez manipuler des palettes de couleurs ou créer des palettes de couleurs personnalisées. Dans ce cas, vous pouvez le faire en utilisant la classe ListedColormap ou la classe LinearSegmentedColormap définie dans la bibliothèque matplotlib.

Avant de créer des palettes de couleurs personnalisées, voyons d’abord comment nous pouvons accéder aux valeurs dans les palettes de couleurs Matplotlib pour comprendre l’implémentation des palettes de couleurs. Cela nous permettra de créer des palettes de couleurs personnalisées de notre choix.

Utilisez la méthode get_cmap() de Matplotlib pour accéder aux cartes de couleurs et à leurs valeurs en Python

Il existe différentes palettes de couleurs définies dans le module Matplotlib. Chaque palette de couleurs a reçu son nom unique. On peut accéder à une palette de couleurs en utilisant la méthode get_cmap() dans le module cm de la bibliothèque matplotlib.

La syntaxe de la méthode get_cmap() est la suivante.

matplotlib.cm.get_cmap(name=None, lut=None)
  1. Le paramètre name accepte le nom de la palette de couleurs sous la forme d’une chaîne ou d’un objet Colormap défini dans le module matplotlib.colors. Sa valeur par défaut est None. Si nous ne spécifions aucune entrée pour le nom du paramètre, la méthode get_cmap() renvoie la palette de couleurs viridis.
  2. Si une palette de couleurs avec le nom spécifié est définie dans la bibliothèque Matplotlib, la méthode get_cmap() renvoie une instance Colormap.
  3. La valeur par défaut du paramètre lut est None. Si lut n’est pas None, ce doit être un entier qui spécifie le nombre de couleurs dans la liste utilisée pour définir la palette de couleurs.
  4. Si le name n’est pas une palette de couleurs valide et que lut n’est pas None, la palette de couleurs est rééchantillonnée pour entrer les valeurs lut dans la table de recherche.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

cm.get_cmap("viridis", 8)

Production :

palette de couleurs matplotlib - viridis

Le code ci-dessus a été exécuté dans le shell interactif du Jupyter Notebook. Si vous essayez de l’exécuter dans un IDE différent, vous pouvez ou non obtenir l’image ci-dessus en sortie.

La palette de couleurs retournée par la méthode get_cmap() est appelable. Lorsque nous passons une valeur entre 0 et 1 à l’objet colormap, il renvoie une valeur RGBA.

Vous pouvez observer cela dans cet exemple.

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))

Production :

(0.122312, 0.633153, 0.530398, 1.0)

Utilisez l’attribut colors de l’objet ListedColormap pour créer une palette de couleurs personnalisée en Python

Pour créer un ListedColormap personnalisé, voyons d’abord comment les couleurs sont stockées dans un ListedColormap. Pour cela, nous pouvons utiliser l’attribut colors de l’objet ListedColormap.

Par exemple, viridis est une ListedColormap. Nous pouvons observer les valeurs de couleur en utilisant l’attribut colors de la palette de couleurs viridis, comme le montre l’exemple suivant.

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)

Production :

[[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.      ]]

Ici, vous pouvez voir que les couleurs sont stockées dans un tableau de Nx4. Vous pouvez également accéder au nombre spécifié de lignes de ListedColormap en appelant le nom de la palette de couleurs avec la séquence requise comme argument d’entrée, comme indiqué ci-dessous.

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)))

Production :

[[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.      ]]

Comme vous pouvez le constater, un ListedColormap est représenté à l’aide d’une liste. Ainsi, pour créer un ListedColormap personnalisé en Python, il va falloir créer une liste qui représentera les couleurs du colormap.

Utiliser les noms de couleur pour créer une palette de couleurs personnalisée en Python

Nous pouvons créer une palette de couleurs personnalisée en utilisant la méthode ListedColormap(). La syntaxe de la méthode ListedColormap() est la suivante.

matplotlib.colors.ListedColormap(colors, name="from_list", N=None)
  1. Le paramètre colors prend un tableau ou une liste de noms de couleurs ou de valeurs numériques représentant les valeurs RGBA.
  2. Le paramètre name permet de donner un nom spécifique à la palette de couleurs personnalisée créée. Il a une valeur par défaut from_list.
  3. Le paramètre N indique le nombre d’entrées dans la palette de couleurs. Sa valeur par défaut est None. Lorsque N a la valeur None, il devrait y avoir une entrée de palette de couleurs pour chaque couleur dans la liste colors.

Pour créer une palette de couleurs personnalisée à l’aide de la méthode ListedColormap() et d’une liste de couleurs, vous pouvez transmettre les noms de quatre couleurs à la méthode ListedColormap(). Il renverra un objet Colormap.

Après cela, vous pouvez utiliser l’objet Colormap pour tracer les données, comme indiqué ci-dessous.

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()

Production :

Utiliser les noms de couleur pour créer une palette de couleurs personnalisée en Python

Utiliser les valeurs RGBA pour créer une palette de couleurs personnalisée en Python

Au lieu d’utiliser les noms de couleurs, vous pouvez utiliser les tableaux avec des valeurs RGBA pour créer la palette de couleurs comme indiqué ci-dessous.

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()

Production :

Utiliser les valeurs RGBA pour créer une palette de couleurs personnalisée en Python

Comment créer une palette de couleurs segmentée linéaire personnalisée en Python ?

Avant de créer des palettes de couleurs segmentées linéaires personnalisées, observons comment les valeurs de couleur sont stockées dans une palette de couleurs segmentée linéaire.

Les palettes de couleurs segmentées linéaires n’ont pas l’attribut color. Cependant, nous pouvons appeler le nom de la palette de couleurs avec la séquence requise comme argument d’entrée pour observer les valeurs de couleur.

Par exemple, nous pouvons regarder les valeurs de couleur de la palette de couleurs cuivre comme suit.

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)))

Production :

[[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’est-ce que cdict dans Matplotlib en Python ?

La classe LinearSegmentedColormap utilise des points d’ancrage entre lesquels les valeurs RGBA sont interpolées pour définir une palette de couleurs segmentée linéaire.

  1. Chaque point d’ancrage est spécifié comme une ligne dans une matrice de la forme [x[i] yleft[i] yright[i]]. Le x[i] est l’ancre, et yleft[i] et yright[i] sont les valeurs de couleur de chaque côté du point d’ancrage.
  2. Si la palette de couleurs présente des discontinuités aux points d’ancrage, les valeurs yleft[i] et yright[i] auront des valeurs différentes. Sinon, yleft[i] et yright[i] ont la même valeur.
  3. Les points d’ancrage sont stockés dans un dictionnaire de couleurs, souvent appelé cdict. Les clés du dictionnaire sont red, green, et blue, et les valeurs correspondantes sont des points d’ancrage spécifiés sous forme de lignes dans une matrice de la forme [x[i] yleft[i] yright[i]]. A chaque entrée d’un cdict, la valeur x[i] doit croître de manière monotone de 0 à 1.

Vous pouvez créer un dictionnaire de couleurs comme suit.

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]],
}

Utiliser des points d’ancrage pour créer une palette de couleurs segmentée linéaire personnalisée en Python

Après avoir créé un cdict, vous pouvez utiliser la méthode LinearSegmentedColormap() pour créer une palette de couleurs linéaire segmentée. La syntaxe de la méthode LinearSegmentedColormap() est la suivante.

matplotlib.colors.LinearSegmentedColormap(name, segmentdata, N=256, gamma=1.0)
  1. Le paramètre name indique le nom de la palette de couleurs. Ce doit être une chaîne.
  2. Le paramètre segmentdata prend le cdict comme argument d’entrée.
  3. Le paramètre N indique le nombre de points dans la table de correspondance de palette de couleurs. Il a une valeur par défaut de 256.
  4. Le paramètre gamma désigne l’échelle utilisée pour les coordonnées x. Il a une valeur par défaut de 1,0.

Comme indiqué ci-dessous, nous pouvons créer une palette de couleurs linéaire segmentée en utilisant la méthode 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()

Production :

Utiliser des points d’ancrage pour créer une palette de couleurs segmentée linéaire personnalisée en Python

Utiliser les noms de couleur pour créer une palette de couleurs segmentée linéaire personnalisée en Python

Au lieu d’utiliser un cdict, nous pouvons également utiliser une liste de couleurs pour créer une palette de couleurs personnalisée. Pour cela, nous pouvons utiliser la méthode LinearSegmentedColormap.from_list(). La syntaxe de la méthode from_list() est la suivante.

from_list(name, colors, N=256, gamma=1.0)

Ici, le paramètre colors prend une liste de couleurs comme argument d’entrée. Tous les autres paramètres sont similaires à la méthode LinearSegmentedColormap().

Vous pouvez créer une palette de couleurs linéaire segmentée en utilisant la méthode from_list() comme suit.

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()

Production :

Utiliser les noms de couleur pour créer une palette de couleurs segmentée linéaire personnalisée en Python

Conclusion

Cet article a présenté différentes manières de créer une palette de couleurs personnalisée à l’aide de Matplotlib en Python. Nous avons créé des cartes de couleurs répertoriées et des cartes de couleurs segmentées linéaires et tracé certaines données à l’aide des cartes de couleurs.

Auteur: 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

Article connexe - Matplotlib Color