2010-07-30 13 views
87

Ho il seguente codice:Set Colorbar Gamma in matplotlib

import matplotlib.pyplot as plt 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

plt.clf() 
plt.pcolor(X, Y, v, cmap=cm) 
plt.loglog() 
plt.xlabel('X Axis') 
plt.ylabel('Y Axis') 

plt.colorbar() 
plt.show() 

Quindi questo produce un grafico dei valori 'v' sugli assi X vs Y, utilizzando la mappa di colori specificato. Gli assi X e Y sono perfette, ma la mappa di colori diffonde tra il minimo e il massimo di v desidero forzare la mappa colori per variare tra 0 e 1.

ho pensato di utilizzare:.

plt.axis(...) 

Per impostare gli intervalli degli assi, ma questo prende solo argomenti per il minimo e il massimo di X e Y, non per la mappa di colori.

Edit:

Per chiarezza, diciamo ho un grafico cui valori variano (0 ... 0,3), e un altro grafico cui valori (0,2 ... 0,8).

In entrambi i grafici, desidero che l'intervallo della barra di colore sia (0 ... 1). In entrambi i grafici, voglio che questa gamma di colori sia identica utilizzando l'intero intervallo di cdict sopra (quindi 0,25 in entrambi i grafici avranno lo stesso colore). Nel primo grafico, tutti i colori compresi tra 0,3 e 1,0 non saranno presenti nel grafico, ma saranno nel tasto della barra colori sul lato. Nell'altro, tutti i colori tra 0 e 0,2 e tra 0,8 e 1 non saranno presenti nel grafico, ma nella barra dei colori sul lato.

risposta

114

Utilizzo di vmin e vmax forza l'intervallo per i colori. Ecco un esempio:

enter image description here

import matplotlib as m 
import matplotlib.pyplot as plt 
import numpy as np 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

x = np.arange(0, 10, .1) 
y = np.arange(0, 10, .1) 
X, Y = np.meshgrid(x,y) 

data = 2*(np.sin(X) + np.sin(3*Y)) 

def do_plot(n, f, title): 
    #plt.clf() 
    plt.subplot(1, 3, n) 
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4) 
    plt.title(title) 
    plt.colorbar() 

plt.figure() 
do_plot(1, lambda x:x, "all") 
do_plot(2, lambda x:np.clip(x, -4, 0), "<0") 
do_plot(3, lambda x:np.clip(x, 0, 4), ">0") 
plt.show() 
10

Non sono sicuro se questa è la soluzione più elegante (questo è quello che ho usato), ma si potrebbe scalare i dati per l'intervallo tra 0 a 1 e quindi modificare il colorbar:

import matplotlib as mpl 
... 
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5) 
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm, 
         norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5)) 
cbar.set_clim(-2.0, 2.0) 

Con i due diversi limiti è possibile controllare la gamma e la legenda della barra dei colori. In questo esempio, nella barra viene visualizzato solo l'intervallo compreso tra -0.5 e 1.5, mentre la mappa dei colori copre da -2 a 2 (quindi questo potrebbe essere l'intervallo di dati, che è possibile registrare prima del ridimensionamento).

Quindi, invece di ridimensionare la mappa dei colori, ridimensionare i dati e adattare la barra dei colori a quella.

+1

Penso che sia fare qualcosa di leggermente diverso ... mi dispiace non era probabilmente abbastanza precisi nella mia domanda La soluzione ridimensiona i colori in modo che quello che rappresenta il valore 1.0 ora rappresenti il ​​valore massimo nei miei dati. La barra colorata mostrerà 0..1 come ne ho bisogno (con vmin = 0, vmax = 1), ma tutto sopra questo valore massimo sarà dello stesso colore ... – Paul

+1

... Ho aggiornato la mia domanda per mostrare cosa Vengo più chiaramente. Scusa se sono stato troppo vago. – Paul

+0

La tua risposta mi ha aiutato a risolvere il mio problema, comunque! – punyidea

39

Utilizzare la CLIM funzione (equivalente a CAXIS funzione in MATLAB):

plt.pcolor(X, Y, v, cmap=cm) 
plt.clim(-4,4) 
plt.show() 
+1

Credo che clim() riduca gli assi dei colori, ma i colori stessi cambiano i valori. Il punto di una certa frazione lungo la scala sarà dello stesso colore indipendentemente dalla scala, ma il valore che rappresenta cambierà. – Paul