matplotlib
colormap
Ricerca…
Utilizzo di base
Usare le mappe dei colori built-in è semplice come passare il nome della mappa di colori richiesta (come indicato nel riferimento a colormap ) alla funzione di pcolormesh
(come pcolormesh
o contourf
) che si aspetta, solitamente sotto forma di un argomento della parola chiave cmap
:
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
plt.pcolormesh(np.random.rand(20,20),cmap='hot')
plt.show()
I colormap sono particolarmente utili per visualizzare i dati tridimensionali su grafici bidimensionali, ma una buona mappa colori può anche rendere molto più chiara una trama tridimensionale appropriata:
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()
Utilizzo di mappe colori personalizzate
A parte le mappe di colori incorporate definite nel riferimento colormaps (e le loro mappe invertite, con '_r'
aggiunto al loro nome), è anche possibile definire mappe di colori personalizzate. La chiave è il modulo matplotlib.cm
.
L'esempio seguente definisce una mappa di colori molto semplice che utilizza cm.register_cmap
, contenente un singolo colore, con l'opacità (valore alfa) del colore che interpola tra completamente opaco e completamente trasparente nell'intervallo di dati. Si noti che le linee importanti dal punto di vista della mappa di colori sono l'importazione di cm
, la chiamata a register_cmap
e il passaggio della mappa di colori a 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()
In scenari più complicati, è possibile definire un elenco di valori R / G / B (/ A) in cui matplotlib interpola linearmente per determinare i colori utilizzati nei grafici corrispondenti.
Mappe colore percettualmente uniformi
La colorazione predefinita predefinita di MATLAB (sostituita nella versione R2014b) chiamata jet
è onnipresente per il suo alto contrasto e familiarità (ed era il default di matplotlib per ragioni di compatibilità). Nonostante la sua popolarità, le mappe di colori tradizionali hanno spesso delle lacune quando si tratta di rappresentare i dati con precisione. Il cambiamento percepito in questi colori non corrisponde ai cambiamenti nei dati; e una conversione della mappa dei colori in scala di grigi (ad esempio stampando una figura usando una stampante in bianco e nero) potrebbe causare la perdita di informazioni.
Sono state introdotte mappe di colori percettualmente uniformi per rendere la visualizzazione dei dati il più accurata e accessibile possibile. Matplotlib ha introdotto quattro nuovi colormap percettivamente uniformi nella versione 1.5, con uno di essi (denominato viridis
) come predefinito dalla versione 2.0. Queste quattro colormap ( viridis
, inferno
, plasma
e magma
) sono tutte ottimali dal punto di vista della percezione e dovrebbero essere utilizzate per la visualizzazione dei dati per impostazione predefinita, a meno che non ci siano ottime ragioni per non farlo. Queste colormap introducono il più piccolo pregiudizio possibile (non creando caratteristiche dove non ce ne sono per cominciare), e sono adatte per un pubblico con una percezione del colore ridotta.
Come esempio per distorcere visivamente i dati, prendi in considerazione i seguenti due diagrammi di vista dall'alto di oggetti simili a piramide:
Quale delle due è una piramide corretta? La risposta è ovviamente che entrambi sono, ma questo è tutt'altro che ovvio dalla trama che usa la mappa jet
colori del jet
:
Questa caratteristica è al centro dell'uniformità percettiva.
Mappa discreta personalizzata
Se hai intervalli predefiniti e desideri utilizzare colori specifici per tali intervalli, puoi dichiarare la mappa colori personalizzata. Per esempio:
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()
produce
Color i verrà utilizzato per valori compresi tra confine iei + 1. I colori possono essere specificati con i nomi ( 'red'
, 'green'
), i codici HTML ( '#ffaa44'
, '#441188'
) o le tuple RGB ( (0.2, 0.9, 0.45)
).