2012-02-14 18 views
9

Grafuję niektóre dane (dwie linie) i chciałbym zmienić styl linii dla części linii, w których różnica między nimi jest statystycznie istotna. Tak więc na poniższym obrazku (teraz link b/c polityki antyspamowej nie zezwalam na publikowanie obrazu) chciałbym, żeby linie wyglądały inaczej (np. Przerywana) do momentu, gdy zaczną się zbierać na poziomie około 35 oś x.Zmień styl linii w stylu matplotlib

line plot

Czy istnieje sposób, aby to zrobić łatwo? Mam wartości dla osi X, w których różnice są znaczące, po prostu nie wiem, jak zmienić style linii w pewnych lokalizacjach osi X.

+3

Co o wykonanie dwóch działek na krzywej? Jeden z pierwszym zbiorem punktów (zanim wartości zaczną się zbierać), a drugi z drugim zestawem. Po prostu ustaw działki tak, aby miały ten sam styl (kolor, marker itp.), Z wyjątkiem stylu linii! :) –

+0

Dzięki, spróbuję tego. Mam kilka innych wątków, w których linie dalej się rozchodzą, zmieniając i tracąc znaczenie. To będzie oznaczać, że będę miał mnóstwo komend fabularnych, ale mam nadzieję, że uda mi się to rozwiązać. – Sceeerutinizer

+0

@ RicardoCardenes- Proponuję umieścić swój komentarz jako odpowiedź, aby można go było wznowić/zaakceptować. Jest to właściwy sposób :-) –

Odpowiedz

14

Edit: Miałem to otwarty i lewo, więc nie zauważyłem @ Odpowiedź Ricarda. Ponieważ matplotlib będzie konwertował pliki na numpy, niezależnie od tego, istnieją skuteczniejsze sposoby na to.

Jako przykład:

wykreślanie dwóch różnych pozycjach, po jednej z przerywaną lineStyle a drugi ze stałym lineStyle.

E.g.

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y1 = 2 * x 
y2 = 3 * x 

xthresh = 4.5 
diff = np.abs(y1 - y2) 
below = diff < xthresh 
above = diff >= xthresh 

# Plot lines below threshold as dotted... 
plt.plot(x[below], y1[below], 'b--') 
plt.plot(x[below], y2[below], 'g--') 

# Plot lines above threshold as solid... 
plt.plot(x[above], y1[above], 'b-') 
plt.plot(x[above], y2[above], 'g-') 

plt.show() 

enter image description here

Dla przypadku, gdzie są one cykliczne, użyj zamaskowanych tablice:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y1 = 2 * np.cos(x) 
y2 = 3 * np.sin(x) 

xthresh = 2.0 
diff = np.abs(y1 - y2) 
below = diff < xthresh 
above = diff >= xthresh 

# Plot lines below threshold as dotted... 
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y1), 'b--') 
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y2), 'g--') 

# Plot lines above threshold as solid... 
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y1), 'b-') 
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y2), 'g-') 

plt.show() 

enter image description here

+0

Was myśląc o czymś takim, ale jakoś postanowiłem zrobić to w sposób złożony: D. Bardzo dobrze :) –

+0

Cieszę się, że odświeżyłem to. Zastanawiałam się tylko nad użyciem zamaskowanej tablicy. Bardzo pomocne. Dziękuję wszystkim za wgląd. – Sceeerutinizer

+0

http://stackoverflow.com/questions/27082282/changing-line-style-for-certain-range-of-values-using-matplotlib – Ohm

3

Załóżmy, że dane są na tablicach numpy dataset1 i dataset2 i masz zdefiniowane threshold jako znaczeniu

def group(data): 
    """Assumes that len(data) > 0""" 
    prev = 0 
    index = 1 
    value = data[0] 

    while (index < len(data)): 
     if data[index] != value: 
      yield (value, prev, index) 

      value = not value 
      prev = index 
     index += 1 

    yield (value, prev, index) 

diff = np.abs(dataset1 - dataset2) 
for significant, start, end in group(diff < threshold): 
    # Plot data from dataset1[start:end] and dataset2[start:end] 
    # Use the value in "significant" (True/False) to figure out 
    # The style 
+0

Myślę, że mógłbym zrobić to krócej używając czegoś z 'itertools', ale myślę, że to wystarczająco dobrze: P –

Powiązane problemy