2015-07-10 23 views
6

Próbuję dowiedzieć się, czy coś jest wbudowane w pyplot, który zmieni kolor mojej linii w zależności od tego, czy dane są negatywne, czy pozytywne. Na przykład, jeśli jest ujemny, chciałbym, aby linia była czerwona, a jeśli jest pozytywna, chciałbym, aby linia była innego koloru, powiedzmy, czarna.Pyplot - zmiana koloru linii, jeśli dane są mniejsze od zera?

Czy jest coś w bibliotece, które pozwala mi to zrobić? Jedną rzeczą, o której pomyślałem, jest podzielenie danych na dwa zestawy pozytywów i negatywów i narysowanie ich osobno, ale zastanawiam się, czy istnieje lepszy sposób.

Odpowiedz

9

Po prostu wykonam dwa zestawy danych i ustawię odpowiednie maski. Używając tego podejścia nie będę mieć linii między różnymi pozytywnymi częściami .

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

Używam tej implementacji i wygląda na to, że działa, więc dziękuję. Poza tym wykopuję nate srebrne wykresy stylu. Kiedy próbuję użyć .style.use mówi, że moduł nie ma nic z tej nazwy - czy wiesz, co się tam dzieje? – MCT

+0

stary matplotlib, po prostu skomentuj linię. – tillsten

+0

Czy "styl" w nowej matplotlib? Chciałbym móc używać tego stylu. – MCT

4

Możesz warunkowo wykreślić dane w swoim obiekcie osi, używając składni podobnej do where (jeśli jesteś przyzwyczajony do czegoś takiego jak Pandy).

Technicznie, dzieli i przygotowuje dane w dwóch zestawach, ale jest dość kompaktowy i ładny.

+1

pamiętać, że wykreślić linie między przejść przez zero. – tillsten

1

Jeśli używasz wykres punktowy można dać każdy punkt inny kolor:

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