2012-03-01 1 views
6

In questo momento sto passando un file a gnuplot via aa pipa in c, qualcosa di simile:Passando array di dati a gnuplot tramite un tubo in c piuttosto che un file

fprintf(gnuplotPipe, "plot \"data-file.dat\" using 1:2\n"); 

non v'è alcun modo che io don È necessario scrivere i dati in un file e poi passarli a gnuplot, quindi per esempio in qualche modo passare un array o un flusso su gnuplot, quindi posso saltare la scrittura in un processo di file e quindi eliminare il file? Qualsiasi aiuto sarebbe apprezzato.

risposta

4

Certo che puoi farlo. Un esempio di un comando da terminale che traccia due punti collegati da una linea è:

echo "plot \"< echo -e '4 5\n 3 2'\" w lp pt 2" | gnuplot 

Se si desidera avere output PostScript è possibile aggiungere il seguente:

echo "set terminal postscript; plot \"< echo -e '4 5\n 3 2'\" w lp pt 2" | gnuplot &> out.ps 

Se ora si utilizza il sistema() o popen() (per catturare il flusso di output) il resto dovrebbe essere semplice.

Modifica: Sembra che esistano alcune interfacce C (++) - Gnuplot. Dai un'occhiata a this website che offre un'ottima panoramica sui wrapper C, C++, Python e Fortran. Non sono sicuro se siano aggiornati e lavorino con le ultime versioni di Gnuplot, ma se non si adatta non dovrebbe essere così difficile.

+0

Grazie per la risposta, non sono sicuro se il motivo per cui avrei bisogno di prendere l'uscita, forse non sto vedendo quello che stai dicendo , il grafico appare automaticamente dopo il comando di stampa. – mihajlv

+0

Facoltativo nel caso in cui si preveda di fare qualcosa di più che limitarsi a guardare i dati. Per il semplice sistema di stampa andrà bene. – Azrael3000

+0

suona bene, proverò la tua risposta, dovrò convertire l'array in un enorme array di caratteri indovinando dalle tue risposte così posso passarlo gnuplot, a meno che non possa in qualche modo passare direttamente l'array (di doppio) stesso a gnuplot ? – mihajlv

0

Gnuplot riconosce il nome file '-' per indicare i dati futuri. Quindi, per tagliare e incollare da quello su cui sto lavorando in questo momento:

FILE *f = popen("gnuplot", "w"); 

fprintf(f, "set term png; " 
"set out 'beforeafter.png'\n" 
"set xlabel 'before'\n" 
"set ylabel 'after'\n" 
"plot '-'\n"); 

//Am using Apophenia in my project, so use its print function to print the data 
apop_data_print(dataset, .output_pipe=f); 

//or use fprintf directly 
for (int i=0; i< data_len; i++) 
    fprintf(f, "%g %g\n", data_x[i], data_y[i]); 

fclose(f);