2012-02-14 16 views
9

Sto graficando alcuni dati (due righe) e mi piacerebbe cambiare lo stile di linea per le porzioni delle linee in cui la differenza tra loro è statisticamente significativa. Quindi, nell'immagine qui sotto (ora un link b/c politiche anti-spam non mi permette di pubblicare un'immagine) Vorrei che le linee sembrassero diverse (cioè tratteggiate forse) fino a quando non iniziano a convergere verso le 35 in poi l'asse x.Modifica lo stile di linea matplotlib mid-graph

line plot

C'è un modo per fare questo facilmente? Ho i valori per l'asse x in cui le differenze sono significative, non mi è chiaro come modificare gli stili di linea in determinate posizioni dell'asse x.

+3

Che dire fare due lotti per ogni curva? Uno con il primo set di punti (prima che i valori inizino a convergere) e poi un altro con il secondo set. Basta impostare i grafici per avere lo stesso stile (colore, pennarello, ecc.), Ad eccezione dello stile della linea! :) –

+0

Grazie, ci proverò. Ho qualche altra trama in cui le linee divergono di nuovo più tardi in bicicletta dentro e fuori di significato. Ciò significa che avrò un sacco di comandi di trama, ma spero di essere in grado di risolverlo. – Sceeerutinizer

+0

@ RicardoCardenes- Ti suggerisco di inserire il tuo commento come risposta in modo che possa essere convertito/accettato. È il modo giusto per farlo :-) –

risposta

14

Edit: avevo avuto questa aperto e lasciato, quindi non ho notato @ La risposta di Ricardo Poiché matplotlib convertirà le cose in array numpy, ci sono modi più efficienti per farlo.

Ad esempio:

Appena localizziamo due linee differenti, uno con un linestyle tratteggiata e uno con stile linea solida.

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

Per il caso in cui sono ciclici, utilizzare le matrici mascherati:

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 pensando a qualcosa del genere, ma in qualche modo ha deciso di farlo nel modo più complesso: D. Molto buono :) –

+0

Sono contento di averlo appena aggiornato. Stavo solo considerando l'utilizzo di un array mascherato. Molto utile. Grazie a tutti per l'intuizione. – Sceeerutinizer

+0

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

3

Diciamo che i dati sono su array NumPy dataset1 e dataset2 e hai definito threshold come significato

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

Penso che potrei farlo più breve usando qualcosa da 'itertools', ma immagino che sia abbastanza buono: P –

Problemi correlati