9

Ich habe eine Figur, die aus einem Bild von imshow(), eine Kontur und ein Vektorfeld von quiver() festgelegt besteht. Ich habe das Vektorfeld basierend auf einer anderen skalaren Größe gefärbt. Auf der rechten Seite meiner Abbildung habe ich eine colorbar() gemacht. Diese colorbar() stellt die Werte dar, die von imshow() angezeigt werden (was in meinem Fall positiv und negativ sein kann). Ich würde gerne wissen, wie ich eine andere Farbleiste einrichten könnte, die auf den Werten der skalaren Größe basiert, auf der die Farbe der Vektoren basiert. Weiß jemand, wie man das macht?Matplotlib: Köcher und Imshow überlagert, wie kann ich zwei Farbbalken setzen?

Hier ist ein Beispiel für das Bild, das ich machen konnte. Beachten Sie, dass die Farben der Vektoren von Blau zu Rot wechseln. Gemäß der aktuellen Farbleiste bedeutet blau negativ. Ich weiß jedoch, dass die durch die Farbe des Vektors dargestellte Menge immer positiv ist.

enter image description here

Antwort

7

einfach colorbar zweimal anrufen, direkt nach jedem Auftragen Anruf. Pylab erstellt eine neue Farbleiste, die dem aktuellen Plot entspricht. Beachten Sie, dass die Köcherwerte wie in Ihrem Beispiel von 0,1 reichen, während die Imshow negative Werte annimmt. Aus Gründen der Übersichtlichkeit (in diesem Beispiel nicht gezeigt) würde ich verschiedene Colormaps verwenden, um die zwei Arten von Plots zu unterscheiden.

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, ist das so einfach? Danke für deine Antwort! Ich bin gespannt: Woher weiß colorbar() welche Daten zu sehen sind? Wie funktioniert es, wenn ich es aus der Perspektive der Objets machen will? – MCF

+0

@Heimdall aus der Dokumentation: "das Bild, ContourSet, usw., auf die die Farbleiste angewendet wird; dieses Argument ist obligatorisch für die Methode colorbar(), aber optional für die Funktion colorbar(), die den Standardwert auf das aktuelle Bild setzt." http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.colorbar. Daher muss das Standardargument "colorbar" den zuletzt gezeichneten Künstler einfügen. Die Dokumente schlagen auch eine Möglichkeit vor, eine feinere Kontrolle darüber zu haben, welche Farbleiste -> Plot. – Hooked

4

Köcher Laufen nicht unbedingt die Art von mappable Objekt zurückgeben, dass colorbar() erfordert. Ich denke, es könnte sein, weil ich explizit das Vektorfeld basierend auf einer anderen skalaren Größe gefärbt habe, wie Heimdall sagt. Daher funktionierte die Antwort von Hooked nicht für mich.

Ich musste meine eigene mappable für den Farbbalken zu lesen erstellen. Ich tat dies, indem Normalize von matplotlib.colors auf den Daten mit, dass ich meine Köcher Vektoren verwenden wollte zu färben (was ich werde C nennen, die als X, Y eine Anordnung von der gleichen Form ist, U und V.)

Mein Köcher Aufruf sieht wie folgt aus:

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

alle anderen Argumente an die colorbar Funktion gab mir eine Vielzahl von Fehlern geben.

My example, where vector color shows third data axis

+0

Können Sie bitte zeigen, wie Sie die Farben in C erzeugt haben? Vielen Dank! – pyan

+0

@pyan, in diesem Fall Farbe zeigte * Zeit *, und all diese Argumente sind 1D-Arrays, so war es so einfach wie etwas wie 'C = dt * np.arange (len (X))' – askewchan

+0

Vielen Dank! Ich dachte, das wäre etwas mit Größe oder Richtung. – pyan

Verwandte Themen