2013-03-27 15 views
8

Ho un set di dati con letture del sensore "continue" effettivamente, con intervalli occasionali.Inserimento di un'interruzione/interruzione in un grafico a linee

Tuttavia, esistono diversi periodi in cui non sono stati registrati dati. Queste lacune sono significativamente più lunghe del periodo di campionamento.

Per impostazione predefinita, pyplot collega ogni punto di dati al successivo (se ho uno stile di linea impostato), tuttavia ritengo che questo sia leggermente fuorviante quando collega i due punti di dati su entrambi i lati di un intervallo lungo.

Preferirei semplicemente non avere linea lì; cioè, vorrei che la linea si fermasse e ricominciare dopo il divario.

Ho provato ad aggiungere un elemento in queste sezioni di gap con il valore y None, ma sembra di inviare la linea indietro a una parte precedente della trama (sebbene stranamente queste linee non appaiano a tutti i livelli di zoom) .

L'altra opzione che ho pensato è di tracciare semplicemente ogni pezzo con una chiamata separata a plot, ma questo sarebbe un po 'brutto e ingombrante.

Esiste un modo più elegante per raggiungere questo obiettivo?

Modifica: di seguito è riportato un esempio di funzionamento minimo che dimostra il comportamento. La prima trama è la linea di congiunzione che sto tentando di evitare. Il secondo grafico mostra che l'aggiunta di un valore None sembra funzionare, tuttavia se si effettua una panoramica della trama, si ottiene ciò che è mostrato nella terza figura, una linea che salta a una parte precedente della trama.

import numpy as np 
import matplotlib.pyplot as plt 

t1 = np.arange(0, 8, 0.05) 
t2 = np.arange(10, 14, 0.05) 
t = np.concatenate([t1, t2]) 
c = np.cos(t) 

fig = plt.figure() 
ax = fig.gca() 
ax.plot(t, c) 
ax.set_title('Undesirable joining line') 


t1 = np.arange(0, 8, 0.05) 
t2 = np.arange(10, 14, 0.05) 
c1 = np.cos(t1) 
c2 = np.cos(t2) 
t = np.concatenate([t1, t1[-1:], t2]) 
c = np.concatenate([c1, [None,], c2]) 

fig = plt.figure() 
ax = fig.gca() 
ax.plot(t, c) 
ax.set_title('Ok if you don\'t pan the plot') 

fig = plt.figure() 
ax = fig.gca() 
ax.plot(t, c) 
ax.axis([-1, 12, -0.5, 1.25]) 
ax.set_title('Strange jumping line') 

plt.show() 

Plot 3, the "strange jumping line"

+1

Sarebbe possibile fare un esempio riproducibile, in particolare mostrando il codice matplotlib che stai usando attualmente per tracciare? –

+0

Buona idea. Aggiunto l'esempio. – Alex

+0

Cosa succede se si chiama plot() due volte? Vale a dire. ax.plot (t1, c1) e ax.plot (t2, c2). Devi impostare il colore manualmente: ax.plot (t1, c1, c = "b") – Robbert

risposta

10

array mascherati funzionano bene per questo. Hai solo bisogno di mascherare il primo dei punti non si desidera collegare:

import numpy as np 
import numpy.ma as ma 
import matplotlib.pyplot as plt 

t1 = np.arange(0, 8, 0.05) 
mask_start = len(t1) 
t2 = np.arange(10, 14, 0.05) 
t = np.concatenate([t1, t2]) 
c = np.cos(t)  # an aside, but it's better to use numpy ufuncs than list comps 

mc = ma.array(c) 
mc[mask_start] = ma.masked 
plt.figure() 
plt.plot(t, mc) 
plt.title('Using masked arrays') 

plt.show() 

enter image description here

Almeno sul mio sistema (OSX, Python 2.7, mpl 1.1.0), I don' Ho problemi con il panning, ecc.

+0

Grazie per il suggerimento. Sulla mia macchina (Python 2.7.3, matplotlib 1.1.1) ottengo ancora la riga indesiderata se eseguo il pan della trama. – Alex

+0

Funziona alla grande, anche in connessione con un 'pandas.DataFrame' – MichaelA

Problemi correlati