Cómo trazar datos en C

Jinku Hu 12 octubre 2023
  1. Utilice la función gnuplot para comprobar el indicador de fin de archivo en el flujo de archivos
  2. Utilice la función popen para transmitir datos del gráfico al proceso gnuplot
Cómo trazar datos en C

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);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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