Fare in modo che il codice C tracci un grafico automaticamente

Ho scritto un programma che scrive un elenco di dati in un file ‘.dat’ con l’intenzione di tracciarlo separatamente usando gnuplot. C’è un modo per far sì che il mio codice lo riproduca automaticamente? La mia uscita è nella forma:

x-coord analytic approximation x-coord analytic approximation x-coord analytic approximation x-coord analytic approximation x-coord analytic approximation .... 

Idealmente, quando eseguo il codice, il grafico verrebbe anche stampato con un’etichetta x, un’etichetta y e un titolo (che potrebbe essere modificato dal mio codice C). Grazie molto.

Mi sono imbattuto in questo mentre cercavo qualcos’altro riguardo a gnuplot. Anche se è una vecchia domanda, ho pensato di contribuire con qualche codice di esempio. Lo uso per un mio programma, e penso che faccia un lavoro piuttosto ordinato. AFAIK, questo PIPEing funziona solo su sistemi Unix (vedi la modifica sotto per gli utenti Windows). L’installazione di gnuplot è l’installazione predefinita dal repository di Ubuntu.

 #include  #include  #define NUM_POINTS 5 #define NUM_COMMANDS 2 int main() { char * commandsForGnuplot[] = {"set title \"TITLEEEEE\"", "plot 'data.temp'"}; double xvals[NUM_POINTS] = {1.0, 2.0, 3.0, 4.0, 5.0}; double yvals[NUM_POINTS] = {5.0 ,3.0, 1.0, 3.0, 5.0}; FILE * temp = fopen("data.temp", "w"); /*Opens an interface that one can use to send commands as if they were typing into the * gnuplot command line. "The -persistent" keeps the plot open even after your * C program terminates. */ FILE * gnuplotPipe = popen ("gnuplot -persistent", "w"); int i; for (i=0; i < NUM_POINTS; i++) { fprintf(temp, "%lf %lf \n", xvals[i], yvals[i]); //Write the data to a temporary file } for (i=0; i < NUM_COMMANDS; i++) { fprintf(gnuplotPipe, "%s \n", commandsForGnuplot[i]); //Send commands to gnuplot one by one. } return 0; } 

MODIFICARE

Nella mia domanda, ho anche riscontrato il problema che il grafico non appare fino a quando il programma chiamante non viene chiuso. Per aggirare questo problema, aggiungi una fflush(gnuplotPipe) dopo aver usato fprintf per inviare il comando finale.

Ho anche visto che gli utenti di Windows possono usare _popen al posto di popen - tuttavia non posso confermarlo perché non ho installato Windows.

MODIFICA 2

Si può evitare di dover scrivere su un file inviando gnuplot al comando plot '-' seguito da punti dati seguiti dalla lettera "e".

per esempio

 fprintf(gnuplotPipe, "plot '-' \n"); int i; for (int i = 0; i < NUM_POINTS; i++) { fprintf(gnuplotPipe, "%lf %lf\n", xvals[i], yvals[i]); } fprintf(gnuplotPipe, "e"); 

È ansible creare uno script gnuplot e generare un processo che esegue gnuplot per tracciare questo script dalla riga di comando, oppure è ansible utilizzare una delle interfacce fornite. Per C, c’è un’interfaccia POSIX basata su pipe di Nicolas Devillard disponibile qui: http://ndevilla.free.fr/gnuplot/ … e una versione C ++ basata su iostream è disponibile tramite git (si veda: http: // http://www.stahlke.org/dan/gnuplot-iostream/ )

Il modo più portatile e probabilmente il più semplice sarebbe comunque chiamare gnuplot per tracciare uno script, comunque. Come citato in sje397, controllare la documentazione per la chiamata system () in stdlib.h.

Su un sidenote, c’è anche GNU plotutils, che offre libplot, una libreria per il tracciamento dei set di dati, che è ansible utilizzare nella propria applicazione. Vedi: http://www.gnu.org/software/plotutils/

Anche se ho visto molti modi per farlo, il modo più semplice per farlo sarebbe quello di usare la funzione system () (da stdlib.h) in C. Prima creare uno script gnuplot e salvarlo come “nome”. gp “(né il nome né la questione dell’estensione).
Una semplice sceneggiatura sarebbe,

 plot 'Output.dat' with lines 

Dopo aver salvato questo file di script, aggiungi
system("gnuplot -p 'name.gp'");
alla fine del tuo codice.
E ‘così semplice.

Ho adattato la risposta accettata per tracciare una matrice mobile evitando l’uso di un file temporaneo. In esso, float* data_ è l’array e size_t size_ sua dimensione. Speriamo sia utile per qualcuno!

Saluti,
Andres

 void plot(const char* name="FloatSignal"){ // open persistent gnuplot window FILE* gnuplot_pipe = popen ("gnuplot -persistent", "w"); // basic settings fprintf(gnuplot_pipe, "set title '%s'\n", name); // fill it with data fprintf(gnuplot_pipe, "plot '-'\n"); for(size_t i=0; i