Cómo trazar datos en C
-
Utilice la función
gnuplot
para comprobar el indicador de fin de archivo en el flujo de archivos -
Utilice la función
popen
para transmitir datos del gráfico al procesognuplot
Este artículo explicará varios métodos de cómo trazar datos en C.
Utilice la función gnuplot
para comprobar el indicador de fin de archivo en el flujo de archivos
gnuplot
es un poderoso programa de trazado que se puede utilizar para mostrar trazados y guardarlos como archivos. Generalmente se usa con conjuntos de datos de archivos con el formato simple basado en columnas donde cada columna está delimitada con un solo espacio, como se muestra a continuación. En este ejemplo, usamos la función popen
para transmitir los comandos al programa gnuplot
y trazar los datos almacenados en un archivo separado. La documentación de gnuplot
se puede leer en esta página. En este caso, usaremos solo los comandos más simples para demostrar el uso.
El comando plot
es la parte central que toma diferentes argumentos y parámetros para procesar y representar el gráfico. Estamos proporcionando un archivo con 2 columnas de números que deben trazarse como un gráfico de líneas. El comando tiene el siguiente formato plot 'input.txt' t 'Price' w lp
, que se construye usando fprintf
y se escribe en el puntero del flujo de archivos devuelto por la llamada popen
. El especificador t
en el comando es la abreviatura del título y la palabra clave w
- with
que indica el estilo del gráfico. En este caso, se elige el estilo lp
(puntos de línea) para representar múltiples puntos de precio durante un período específico. Observe que explícitamente limpiamos
el flujo para asegurarnos de que los datos se entregan al programa gnuplot
y finalmente pausamos el programa con la función getchar
para asegurarnos de que el gráfico se muestra hasta que el usuario lo cierra.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *filename = "input.txt";
FILE *gnuplot = popen("gnuplot", "w");
if (!gnuplot) {
perror("popen");
exit(EXIT_FAILURE);
}
fprintf(gnuplot, "plot \"%s\" t 'Price' w lp\n", filename);
fflush(gnuplot);
fprintf(stdout, "Click Ctrl+d to quit...\n");
getchar();
pclose(gnuplot);
exit(EXIT_SUCCESS);
}
Formato de archivo de entrada:
2005 49
2006 52
...
2019 154
2020 127
2021 147
Utilice la función popen
para transmitir datos del gráfico al proceso gnuplot
Alternativamente, podemos transmitir los datos almacenados previamente en un archivo separado directamente desde la memoria del programa. La función popen
se utiliza nuevamente para abrir una comunicación de tubería al programa gnuplot
y luego enviar los números almacenados en matrices con un formato especial. En este ejemplo, el comando tiene el formato - plot '-' u 1:2 t 'Price' w lp
, seguido de los elementos de datos y finalmente terminado con el carácter e
. Cada entero debe separarse con un espacio y pasar con un formato similar al del archivo de entrada del ejemplo anterior. Por lo tanto, utilizamos la función fprintf
para escribir texto formateado en el flujo de tubería gnuplot
. Tenga en cuenta que los flujos de archivos abiertos con la llamada popen
deben cerrarse con la función pclose
.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int x[] = {2015, 2016, 2017, 2018, 2019, 2020};
int y[] = {344, 543, 433, 232, 212, 343};
FILE *gnuplot = popen("gnuplot", "w");
if (!gnuplot) {
perror("popen");
exit(EXIT_FAILURE);
}
fprintf(gnuplot, "plot '-' u 1:2 t 'Price' w lp\n");
for (int i = 0; i < 6; ++i) {
fprintf(gnuplot, "%d %d\n", x[i], y[i]);
}
fprintf(gnuplot, "e\n");
fprintf(stdout, "Click Ctrl+d to quit...\n");
fflush(gnuplot);
getchar();
pclose(gnuplot);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook