matplotlib
Colormaps
Recherche…
Utilisation de base
L' utilisation colormaps intégré est aussi simple que passer le nom de la palette de couleurs nécessaire (comme indiqué dans la référence de colormaps ) à la fonction de traçage (comme pcolormesh
ou contourf
) qui l' attend, le plus souvent sous la forme d'un cmap
argument mot - clé:
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
plt.pcolormesh(np.random.rand(20,20),cmap='hot')
plt.show()
Les Colormaps sont particulièrement utiles pour visualiser des données tridimensionnelles sur des tracés bidimensionnels, mais une bonne palette de couleurs peut également rendre un tracé tridimensionnel correct plus clair:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import LinearLocator
# generate example data
import numpy as np
x,y = np.meshgrid(np.linspace(-1,1,15),np.linspace(-1,1,15))
z = np.cos(x*np.pi)*np.sin(y*np.pi)
# actual plotting example
fig = plt.figure()
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(x,y,z,rstride=1,cstride=1,cmap='viridis')
ax2 = fig.add_subplot(122)
cf = ax2.contourf(x,y,z,51,vmin=-1,vmax=1,cmap='viridis')
cbar = fig.colorbar(cf)
cbar.locator = LinearLocator(numticks=11)
cbar.update_ticks()
for ax in {ax1, ax2}:
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_aspect('equal')
ax1.set_zlim([-1,1])
ax1.set_zlabel(r'$\cos(\pi x) \sin(\p i y)$')
plt.show()
Utilisation de couleurs personnalisées
Outre les colonnes de couleurs intégrées définies dans la référence de couleurs (et leurs mappes inversées, avec '_r'
ajouté à leur nom), des couleurs personnalisées peuvent également être définies. La clé est le module matplotlib.cm
.
L'exemple ci-dessous définit une palette de cm.register_cmap
très simple à l'aide de cm.register_cmap
, contenant une seule couleur, l'opacité (valeur alpha) de la couleur interpolant entièrement opaque et totalement transparente dans la plage de données. Notez que les lignes importantes du point de vue de la palette de couleurs sont l'importation de cm
, l'appel à register_cmap
et le passage de la palette de plot_surface
à plot_surface
.
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.cm as cm
# generate data for sphere
from numpy import pi,meshgrid,linspace,sin,cos
th,ph = meshgrid(linspace(0,pi,25),linspace(0,2*pi,51))
x,y,z = sin(th)*cos(ph),sin(th)*sin(ph),cos(th)
# define custom colormap with fixed colour and alpha gradient
# use simple linear interpolation in the entire scale
cm.register_cmap(name='alpha_gradient',
data={'red': [(0.,0,0),
(1.,0,0)],
'green': [(0.,0.6,0.6),
(1.,0.6,0.6)],
'blue': [(0.,0.4,0.4),
(1.,0.4,0.4)],
'alpha': [(0.,1,1),
(1.,0,0)]})
# plot sphere with custom colormap; constrain mapping to between |z|=0.7 for enhanced effect
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x,y,z,cmap='alpha_gradient',vmin=-0.7,vmax=0.7,rstride=1,cstride=1,linewidth=0.5,edgecolor='b')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.set_aspect('equal')
plt.show()
Dans des scénarios plus compliqués, on peut définir une liste de valeurs R / G / B (/ A) dans lesquelles matplotlib interpole linéairement afin de déterminer les couleurs utilisées dans les tracés correspondants.
Colormaps perceptuellement uniformes
La carte de couleurs originale par défaut de MATLAB (remplacée dans la version R2014b) appelée jet
est omniprésente en raison de son contraste élevé et de sa familiarité (et était la valeur par défaut de matplotlib pour des raisons de compatibilité). En dépit de sa popularité, les cartes de couleurs traditionnelles présentent souvent des lacunes en matière de représentation précise des données. Le changement perçu dans ces couleurs ne correspond pas aux changements de données; et une conversion de la palette de couleurs en niveaux de gris (en imprimant, par exemple, une image en utilisant une imprimante noir et blanc) peut entraîner une perte d'informations.
Des palettes de couleurs perceptuellement uniformes ont été introduites pour rendre la visualisation des données aussi précise et accessible que possible. Matplotlib a introduit quatre nouvelles couleurs personnalisées dans la version 1.5, dont l'une (nommée viridis
) par défaut depuis la version 2.0. Ces quatre couleurs ( viridis
, inferno
, plasma
et magma
) sont toutes optimales du point de vue de la perception et devraient être utilisées par défaut pour la visualisation des données, à moins de bonnes raisons de ne pas le faire. Ces couleurs permettent d'introduire le moins de biais possible (en ne créant pas de fonctionnalités là où il n'y en a pas), et conviennent à un public dont la perception des couleurs est réduite.
À titre d'exemple pour les données de distorsion visuelle, considérez les deux tracés de vue supérieure d'objets pyramidaux suivants:
Lequel des deux est une véritable pyramide? La réponse est bien sûr que les deux sont, mais ceci est loin d’être évident à partir de l’intrigue utilisant la palette de jet
:
Cette caractéristique est au cœur de l'uniformité perceptuelle.
Palette de couleurs discrète personnalisée
Si vous avez des plages prédéfinies et que vous souhaitez utiliser des couleurs spécifiques pour ces plages, vous pouvez déclarer une palette de couleurs personnalisée. Par exemple:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors
x = np.linspace(-2,2,500)
y = np.linspace(-2,2,500)
XX, YY = np.meshgrid(x, y)
Z = np.sin(XX) * np.cos(YY)
cmap = colors.ListedColormap(['red', '#000000','#444444', '#666666', '#ffffff', 'blue', 'orange'])
boundaries = [-1, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 1]
norm = colors.BoundaryNorm(boundaries, cmap.N, clip=True)
plt.pcolormesh(x,y,Z, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()
Produit
La couleur i sera utilisée pour les valeurs comprises entre la limite i et i + 1 . Les couleurs peuvent être spécifiées par des noms ( 'red'
, 'green'
), des codes HTML ( '#ffaa44'
, '#441188'
) ou des '#441188'
RVB ( (0.2, 0.9, 0.45)
).