2015-07-10 6 views
6

Ich versuche herauszufinden, ob etwas in pyplot eingebaut ist, das die Farbe meiner Zeile ändert, abhängig davon, ob die Daten negativ oder positiv sind. Zum Beispiel, wenn es negativ ist, möchte ich, dass die Linie rot ist und wenn es positiv ist, möchte ich, dass die Linie eine andere Farbe hat, sagen wir schwarz.Pyplot - Farbe der Linie ändern, wenn Daten kleiner als Null sind?

Gibt es etwas in der Bibliothek, das mir das ermöglicht? Eine Sache, an die ich gedacht habe, ist, die Daten in zwei Sätze von Positiv und Negativ aufzuteilen und sie getrennt zu zeichnen, aber ich frage mich, ob es einen besseren Weg gibt.

Antwort

9

Ich würde nur zwei Datensätze erstellen und die richtigen Masken einstellen. Mit diesem Ansatz habe ich keine Linien zwischen verschiedenen positiven Teile.

import matplotlib.pyplot as plt 
import numpy as np 

signal = 1.2*np.sin(np.linspace(0, 30, 2000)) 
pos_signal = signal.copy() 
neg_signal = signal.copy() 

pos_signal[pos_signal <= 0] = np.nan 
neg_signal[neg_signal > 0] = np.nan 

#plotting 
plt.style.use('fivethirtyeight') 
plt.plot(pos_signal, color='r') 
plt.plot(neg_signal, color='b') 
plt.savefig('pos_neg.png', dpi=200) 
plt.show() 

Example

+0

Ich benutze diese Implementierung und es scheint zu funktionieren, also danke. Auch ich graben die nate silver style Graphen. Wenn ich versuche, .style.use zu verwenden, sagt es, dass das Modul nichts von diesem Namen hat - würdest du wissen, was dort vor sich geht? – MCT

+0

alte Matplotlib, nur aus der Zeile kommentieren. – tillsten

+0

Ist "Stil" in der neuen Matplotlib? Ich würde gerne in der Lage sein, diesen Stil zu verwenden – MCT

4

Sie können Daten in Ihrem Achsenobjekt unter Verwendung einer where ähnlichen Syntax konditionieren (wenn Sie an etwas wie Pandas gewöhnt sind).

ax.plot(x[f(x)>=0], f(x)[f(x)>=0], 'g') 
ax.plot(x[f(x)<0], f(x)[f(x)<0], 'r') 

Technisch gesehen teilt und plottet man seine Daten in zwei Sätzen, aber es ist ziemlich kompakt und schön.

+1

Beachten Sie, dass Linien zwischen Nulldurchgängen plot. – tillsten

1

Wenn Sie ein Streudiagramm verwenden Sie jedem Punkt eine andere Farbe geben kann:

x = range(1) 
x = range(10) 
y = [i - 5 for i in x] 
c = [i < 0 for i in y] 
plt.scatter(x, y, c=c, s=80) 

enter image description here

Verwandte Themen