2013-06-04 15 views
12

Używam matplotlib do utworzenia prostego wykresu liniowego. Mój wykres to prosty zbiór danych z serii czasowych, w którym mam czas wzdłuż osi X i wartość czegoś, co mierzę na osi Y. Wartości y mogą mieć wartości postycyjne lub ujemne i chciałbym wypełnić obszar powyżej i poniżej mojej linii z kolorem niebieskim, jeśli wartość y jest> 0 i czerwona, jeśli wartości y wynoszą < 0. Oto moja działka:Wypełnianie powyżej/poniżej linii działki matplotlib

enter image description here

Jak widać, mogę uzyskać niebieski kolor, aby wypełnić poprawnie, ale nie mogę uzyskać czerwony kolor, aby wypełnić prawidłowo. Oto kod podstawowy Używam:

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

Jak mogę uzyskać obszar od dodatniej wartość Y na osi x będzie niebieski, a obszar z ujemnym wartość Y na osi x do być czerwony? Dzięki za pomoc.

+2

Wierzę, że ostatnią linią w fragmencie kodu powinno być 'ax.fill_between (xs, ys, gdzie = ys <= d, color = 'red')', ponieważ próbujesz wypełnić obszar między 'y1 = 0' i 'y2 = 0' (tzn. Bez obszaru). Drugi argument (w tym przypadku 'ys') jest przekazywany do parametru' y1', a ponieważ 'y2' ma wartość domyślną' 0', metoda wypełni obszar _between_ tablicę określoną dla 'y1' i linia y = 0, która jest tym, czego potrzebujesz. – hooy

+0

Dzięki za pomoc. Twoja sugestia częściowo działała. Jednak nadal nie otrzymuję właściwego wypełnienia kolorem w przypadkach, w których punkt mówi (10, 10) jest połączony z innym punktem, który przecina oś X, powiedzmy (11, -10). Oto, jak wygląda fabuła: http://postimg.org/image/u329jhlob/ – user1728853

+1

Ach, pomyślałem, że właśnie tego chciałaś, widząc, jak powiedziałeś, że niebieskie wypełnienie na powyższej ilustracji było poprawne. Powinno to być łatwe rozwiązanie: 'ax.fill_between (xs, ys, gdzie = ys <= d, interpolate = True, color = 'red')'. Parametr 'interpolate' powoduje, że funkcja interpoluje, aby znaleźć przecięcie między tablicami" y1 "i" y2 ", aby uzyskać" gładszy "wykres. – hooy

Odpowiedz

15

Fragment kodu podałeś powinny być korygowane w następujący sposób:

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

Sposób fill_between trwa co najmniej dwa argumenty x i y1, podczas gdy ma ona również parametr y2 z domyślnej wartości 0. Metoda wypełni obszar między y1 i y2 dla określonych wartości-x.

Powodem dlaczego nie dostał żadnej wypełnienie poniżej osi x, to ze względu na fakt, że trzeba było podanej że metoda fill_between należy wypełnić obszar pomiędzy y1=0 i y2=0, tj nie kierunkowym. Aby upewnić się, że wypełnienie nie pojawia się tylko na wartościach X, należy określić, że metoda powinna interpolować y1, aby znaleźć skrzyżowania z y2, co należy wykonać, określając interpolate=True w wywołaniu metody.

+0

Świetna odpowiedź, dzięki! Działa także, jeśli pominiesz drugą linię będącą = ... 'i zastąpisz zmienną'''' 'w trzeciej i następnej linii. –

+1

@TomPohl Dzięki. Tak, jestem tego świadomy. Powodem, dla którego zachowałem stwierdzenie 'd = ...' jest to, że nie wprowadzam więcej zmian do oryginalnego kodu OP niż to konieczne, aby było funkcjonalne. Ma to na celu upewnienie się, że nie ma pomyłki co do miejsca "pomyłki". – hooy

+0

Rozumiem.Chciałem tylko upewnić się, że inni używający Twojego rozwiązania wiedzą o skrócie. –

2

Spróbuj ustawić słowo kluczowe interpolate=True.

+0

Ah, @nordev już to napisał w powyższym komentarzu. Proponuję zamienić komentarz na odpowiedź, aby można go było poprawnie przegłosować. – Thriveth

Powiązane problemy