9

Ho una figura che consiste in un'immagine visualizzata da imshow(), un contorno e un campo vettoriale impostato da quiver(). Ho colorato il campo vettoriale in base a un'altra quantità scalare. A destra della mia figura, ho creato un numero colorbar(). Questo colorbar() rappresenta i valori visualizzati da imshow() (che può essere positivo e negativo nel mio caso). Mi piacerebbe sapere come impostare un'altra barra colori che si basi sui valori della quantità scalare su cui si basa il colore dei vettori. Qualcuno sa come farlo?Matplotlib: quiver e imshow sovrapposti, come posso impostare due barre colorate?

Ecco un esempio dell'immagine che ho potuto fare. Si noti che i colori dei vettori passano dal blu al rosso. Secondo la colorbar corrente, il blu significa negativo. Tuttavia so che la quantità rappresentata dal colore del vettore è sempre positiva.

enter image description here

risposta

7

Basta chiamare colorbar due volte, subito dopo ogni chiamata la stampa. Pylab creerà una nuova colorbar corrispondente all'ultima trama. Nota che, come nel tuo esempio, i valori di quiver vanno da 0,1 mentre l'imshow assume valori negativi. Per chiarezza (non mostrato in questo esempio), utilizzerei diverse mappe di colori per distinguere i due tipi di grafici.

import numpy as np 
import pylab as plt 

# Create some sample data 
dx = np.linspace(0,1,20) 
X,Y = np.meshgrid(dx,dx) 
Z = X**2 - Y 
Z2 = X 

plt.imshow(Z) 
plt.colorbar() 

plt.quiver(X,Y,Z2,width=.01,linewidth=1) 
plt.colorbar() 

plt.show() 

enter image description here

+0

Oh è così semplice? Grazie per la tua risposta! Sono curioso: in che modo colorbar() sa quali dati guardare? Come funziona se voglio farlo dal punto di vista degli objets? – MCF

+0

@Heimdall dai documenti: "Immagine, ContourSet, ecc. A cui si applica la barra dei colori, questo argomento è obbligatorio per il metodo colorbar() ma facoltativo per la funzione colorbar(), che imposta il valore predefinito sull'immagine corrente." http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.colorbar. Quindi l'argomento di default 'colorbar' deve essere inserito nell'ultimo artista disegnato. I documenti suggeriscono anche un modo per avere un controllo più fine su cui colorbar -> trama. – Hooked

4

faretra esecuzione non necessariamente restituire il tipo di oggetto mappabile che colorbar() richiede. Penso che potrebbe essere perché ho esplicitamente "colorato il campo vettoriale basato su un'altra quantità scalare" come dice Heimdall. Pertanto, la risposta di Hooked non ha funzionato per me.

Ho dovuto creare il mio mappabile per la barra dei colori da leggere. Ho fatto questo utilizzando Normalize dal matplotlib.colors sui dati che ho voluto usare per colorare i miei vettori faretra (che chiamerò C, che è una serie della stessa forma X, Y, U, e V.)

la mia chiamata faretra si presenta così:

import matplotlib.pyplot as pl 
import matplotlib.cm as cm 
import matplotlib.colors as mcolors 
import matplotlib.colorbar as mcolorbar 
pl.figure() 

nz = mcolors.Normalize() 
nz.autoscale(C) 

pl.quiver(X, Y, U, V, color=cm.jet(nz(C))) 
cax,_ = mcolorbar.make_axes(pl.gca()) 
cb = mcolorbar.ColorbarBase(cax, cmap=cm.jet, norm=nz) 
cb.set_label('color data meaning') 

Dare tutti gli altri argomenti per la funzione colorbar mi ha dato una serie di errori.

My example, where vector color shows third data axis

+0

Puoi mostrare come hai generato i colori in C? Grazie! – pyan

+0

@pyan, in questo caso il colore stava mostrando * ora *, e tutti quegli argomenti sono array 1D, quindi era semplice come qualcosa come 'C = dt * np.arange (len (X))' – askewchan

+0

Grazie! Pensavo che fosse qualcosa di correlato con la grandezza o la direzione. – pyan