Hacer código C trazar un gráfico automáticamente

He escrito un progtwig que escribe una lista de datos en un archivo ‘.dat’ con la intención de trazarlo por separado usando gnuplot. ¿Hay alguna manera de hacer que mi código grafique automáticamente? Mi salida es de la forma:

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

Idealmente, cuando ejecuto el código, el gráfico también se imprimirá con una etiqueta x, etiqueta y título (que podría cambiarse de mi código C). Muchas gracias.

Me encontré con esto mientras buscaba algo más con respecto a gnuplot. Aunque es una vieja pregunta, pensé que contribuiría con un código de muestra. Utilizo esto para un progtwig mío, y creo que hace un trabajo bastante ordenado. AFAIK, este PIPEing solo funciona en sistemas Unix (ver la edición a continuación para usuarios de Windows). La instalación de mi gnuplot es la instalación predeterminada del repository de 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; } 

EDITAR

En mi aplicación, también me encontré con el problema de que la ttwig no aparece hasta que se cierra el progtwig de llamadas. Para evitar esto, agregue un fflush(gnuplotPipe) después de haber usado fprintf para enviar su comando final.

También he visto que los usuarios de Windows pueden usar _popen en lugar de popen ; sin embargo, no puedo confirmarlo ya que no tengo instalado Windows.

EDIT 2

Uno puede evitar tener que escribir en un archivo enviando a gnuplot el comando plot '-' seguido de puntos de datos seguidos por la letra "e".

p.ej

 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"); 

Puede crear un script gnuplot y generar un proceso ejecutando gnuplot para trazar este script desde la línea de comandos, o puede usar una de las interfaces provistas. Para C, hay una interfaz POSIX basada en tuberías de Nicolas Devillard disponible aquí: http://ndevilla.free.fr/gnuplot/ … y una versión de C ++ basada en iostream está disponible a través de git (ver: http: // http://www.stahlke.org/dan/gnuplot-iostream/ )

Sin embargo, la forma más portátil y probablemente la más fácil sería llamar a gnuplot para trazar un script. Como mencionó sje397, verifique su documentación para la llamada al sistema () en stdlib.h.

En una nota al margen, también está GNU plotutils, que ofrece libplot, una biblioteca para el trazado de datasets, que puede usar en su aplicación. Ver: http://www.gnu.org/software/plotutils/

Aunque he visto muchas maneras de hacerlo, la forma más sencilla de hacerlo sería mediante el uso de la función system () (desde stdlib.h) en C. Primero, cree un script gnuplot y guárdelo como “name”. gp “(ni el nombre ni la extensión importan).
Un script simple sería,

 plot 'Output.dat' with lines 

Después de guardar este archivo de script, simplemente agregue
system("gnuplot -p 'name.gp'");
al final de tu código
Es tan simple como eso.

He adaptado la respuesta aceptada para trazar una matriz flotante mientras evito el uso de un archivo temporal. En él, float* data_ es la matriz y size_t size_ su tamaño. ¡Espero que sea útil para alguien!

Aclamaciones,
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