2012-02-06 7 views
5

Sto cercando di trovare uno strumento per tracciare i dati (principalmente grafici a linee e simili) che possono essere utilizzati per applicazioni ad alte prestazioni. La mia finestra di dati contiene in genere tra 500 e migliaia di punti, e sarei felice con un framerate di 10 o giù di lì. Ricevo i miei dati come stream binario su un socket. Sono su Mac OS X.Visualizzazione dati in tempo reale ad alte prestazioni

Ho provato diverse soluzioni e discuto le mie esperienze con loro di seguito.

R: tremendamente lento e incapace di tenere il passo, dolorose leggere prese, sfarfallio grafico.

matplotlib: piuttosto lento ma un po 'usabile, anche. Tuttavia, richiede un sacco di macchinari Python da eseguire, e IMO l'API è piuttosto opaca. Sotto costante aggiornamento, la finestra contenente il grafico diventa modale e appare il beachball Mac, non eccezionale per l'interazione dell'utente.

Gnuplot: Prestazioni e API molto migliori. Tuttavia, comunicare grandi quantità di dati a gnuplot avviene generando file ASCII temporanei (!) - questo significa che se il mio framerate sale, sto iniziando a fare tonnellate di letture del disco e questo è un problema di prestazioni.

Altri suggerimenti?

+0

la tua domanda sembra simile alla mia: http://stackoverflow.com/questions/8946474/is-it-possible-to-speed-up-matlab-plotting-by-calling-cc-code-in-matlab – memyself

+0

Non sono sicuro di poterlo fare al di fuori di C++ o di altre lingue, ma prevengo lo sfarfallio dipingendo su una bitmap di memoria e poi lo si confonde sullo schermo. Questo è in realtà più veloce perché non è il ritaglio di rettangoli sovrapposti durante la vernice. Inoltre, per l'utente sembra veloce anche se non lo è. –

+0

@MikeDunlavey Grazie - ma quali tecnologie usi per tracciare e dipingere. – Jake

risposta

4

Provare gnuplot utilizzando i dati in pipe anziché i file temporanei. Utilizzo Esempio:

plot "data_acquisition_cmd <" with image 

È possibile reindirizzare in un flusso infinito di Ristampe leggendo comandi da un tubo così:

load "while [ 1 ]; do echo 'replot'; done <" 

Per una soluzione più robusta, non utilizzando un'interfaccia a gnuplot da Perl, come GnuplotIF o Python (gnuplot.py), poiché consentono sia il controllo programmatico di gnuplot sia la possibilità di passare i dati direttamente ad esso.

Edit: Grazie Jonhoo per la correzione della sintassi

+0

Per coloro che provano questo e ottengono un sacco di errori, sostituire il trailing | con un leader <, e dovrebbe funzionare correttamente –

+0

@Jonhoo: è una cosa specifica della piattaforma, o dovrei modificare la risposta? –

+0

Da quello che posso dire dalla [documentazione gnuplot] (http://gnuplot.info/docs_4.6/gnuplot.pdf), '<' è l'unico modo accettato di eseguire il piping dei dati da uno script esterno a gnuplot sia per i dati (p83) e per 'load' (p71). '|' viene usato, afaict, solo per le operazioni di output in cui si desidera eseguire il pipe di outup di gnuplot da qualche parte ('save',' print' o 'output'). –

0

La libreria Qwt ha la capacità di tracciare i dati in tempo reale. Ci sono persino un paio di esempi nell'albero dei sorgenti che forniscono diversi modi di tracciare in tempo reale. In particolare, suggerirei di guardare l'oscilloscopio, gli esempi più freschi e in tempo reale.

Inoltre, c'è stato anche un recent discussion sulla mailing list che potrebbe essere utile.