2013-06-04 7 views
12

Ich benutze Matplotlib, um ein einfaches Liniendiagramm zu erstellen. Mein Diagramm ist ein einfacher Zeitreihendatensatz, in dem ich Zeit entlang der x-Achse und den Wert von etwas habe, das ich auf der y-Achse vermesse. y-Werte können postive oder negative Werte haben und ich möchte den Bereich über und unter meiner Linie mit der Farbe blau füllen, wenn der y-Wert> 0 ist und rot, wenn der y-Wert < 0 ist. Hier ist mein Plot:Füllung über/unter Matplotlib Liniendiagramm

enter image description here

Wie Sie sehen können, kann ich die blaue Farbe erhalten richtig zu füllen, aber ich kann nicht die rote Farbe bekommen richtig zu füllen. Hier ist der Grund-Code Ich verwende:

plt.plot(x, y, marker='.', lw=1) 
d = scipy.zeros(len(y)) 
ax.fill_between(xs,ys,where=ys>=d, color='blue') 
ax.fill_between(xs,0,where=ys<=d, color='red') 

Wie kann ich den Bereich von einem positiven y-Wert auf der x-Achse erhalten werden blau und die Fläche von einem negativen y-Wert auf der x-Achse rot sein? Danke für die Hilfe.

+2

Ich glaube, die letzte Zeile im Code-Snippet sollte 'ax.fill_between (xs, ys, wobei = ys <= d, color = 'red')' sein, da Sie jetzt versuchen, den Bereich zwischen 'y1 zu füllen = 0' und 'y2 = 0' (dh keine Fläche). Das zweite Argument (in diesem Fall 'ys') wird an den Parameter 'y1' übergeben, und da 'y2' den Standardwert '0' hat, füllt die Methode den Bereich _zwischen_ dem Array, das Sie für 'y1' und den Parameter ' Linie y = 0, was du willst. – hooy

+0

Danke für die Hilfe. Dein Vorschlag hat teilweise funktioniert. Allerdings gebe ich immer noch nicht die richtige Farbfüllung in Fällen, wo ein Punkt sagt, (10, 10) ist mit einem anderen Punkt verbunden, der die x-Achse kreuzt, sagen wir (11, -10). Hier ist, wie die Handlung aussieht: http://postimg.org/image/u329jhlob/ – user1728853

+1

Ah, ich dachte, das ist, was Sie wollten, zu sehen, wie Sie sagten, die blaue Füllung auf der obigen Abbildung war richtig. Dies sollte eine einfache Lösung sein: 'ax.fill_between (xs, ys, wo = ys <= d, interpolieren = True, color = 'red')'. Der Parameter interpolieren bewirkt, dass die Funktion interpoliert, um den Schnittpunkt zwischen den Arrays "y1" und "y2" zu finden, um eine "glattere" Darstellung zu erhalten. – hooy

Antwort

15

die Code-Snippet Ihnen zur Verfügung gestellten soll wie folgt korrigiert werden:

plt.plot(x, y, marker='.', lw=1) 
d = scipy.zeros(len(y)) 
ax.fill_between(xs, ys, where=ys>=d, interpolate=True, color='blue') 
ax.fill_between(xs, ys, where=ys<=d, interpolate=True, color='red') 

Die fill_between Verfahren mindestens zwei Argumente nehmen x und y1, während es auch einen Parameter y2 mit Standardwert 0. Die Methode füllt hat der Bereich zwischen y1 und y2 für die angegebenen x -Werte.

Der Grund, warum Sie keine Füllung unterhalb der x-Achse erhalten haben ist, aufgrund der Tatsache, dass Sie, dass die fill_between angegeben hatte Methode den Bereich zwischen y1=0 und y2=0, das heißt kein Bereich füllen sollte. Um sicherzustellen, dass die Füllung nicht nur unter expliziten x-Werten angezeigt wird, geben Sie an, dass die Methode y1 interpolieren soll, um die Schnittpunkte mit y2 zu finden, was durch Angabe von interpolate=True im Methodenaufruf erfolgt.

+0

Große Antwort, danke! Es funktioniert auch, wenn Sie die zweite Zeile "= ..." überspringen und die Variable "" in der dritten und vierten Zeile durch "0" ersetzen. –

+1

@TomPohl Danke. Ja, ich bin mir dessen bewusst. Der Grund, warum ich die Anweisung "d = ..." beibehalten habe, ist, dass ich den ursprünglichen Code des OPs nicht mehr ändere als nötig, um ihn funktionsfähig zu machen. Dadurch wird sichergestellt, dass keine Verwirrung darüber besteht, wo sich der "Fehler" befunden hat. – hooy

+0

Ich verstehe.Ich wollte nur sicherstellen, dass andere, die Ihre Lösung verwenden, über die Verknüpfung Bescheid wissen. –

2

Versuchen Sie, das Schlüsselwort interpolate=True einzustellen.

+0

Ah, @nordev schrieb bereits das in dem obigen Kommentar. Ich schlage vor, dass Sie Ihren Kommentar in eine Antwort umwandeln, damit er ordnungsgemäß hochgestuft werden kann. – Thriveth