Como traçar dados em C

Jinku Hu 12 outubro 2023
  1. Use a função gnuplot para verificar o indicador de fim de arquivo no fluxo de arquivos
  2. Use a função popen para transmitir dados do gráfico para o processo gnuplot
Como traçar dados em C

Este artigo irá explicar vários métodos de como plotar dados em C.

Use a função gnuplot para verificar o indicador de fim de arquivo no fluxo de arquivos

gnuplot é um poderoso programa de plotagem que pode ser utilizado para exibir plotagens e salvá-las como arquivos. Geralmente é usado com conjuntos de dados de arquivo com o formato baseado em coluna simples, onde cada coluna é delimitada com um único espaço, conforme mostrado abaixo. Neste exemplo, usamos a função popen para transmitir os comandos para o programa gnuplot e plotar os dados que são armazenados em um arquivo separado. A documentação do gnuplot pode ser lida nesta página. Nesse caso, usaremos apenas os comandos mais simples para demonstrar o uso.

O comando plot é a parte central que leva diferentes argumentos e parâmetros para processar e renderizar o gráfico. Estamos fornecendo um arquivo com 2 colunas de números que precisam ser plotados como um gráfico de linha. O comando tem o seguinte formato plot 'input.txt' t 'Price' w lp, que é construído usando fprintf e escrito no ponteiro do fluxo de arquivo retornado da chamada popen. O especificador t no comando é uma abreviatura de título e w - with ​​a palavra-chave que indica o estilo do gráfico. Nesse caso, o estilo lp (pontos de linha) é escolhido para representar vários pontos de preço em um período específico. Observe que explicitamente fflush o fluxo para garantir que os dados sejam entregues ao programa gnuplot e, finalmente, pausamos o programa com a função getchar para garantir que o gráfico seja exibido até que o usuário o feche.

#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 arquivo de entrada:

2005 49
2006 52
...
2019 154
2020 127
2021 147

Use a função popen para transmitir dados do gráfico para o processo gnuplot

Como alternativa, podemos transmitir os dados armazenados anteriormente em um arquivo separado diretamente da memória do programa. A função popen é usada novamente para abrir um pipe de comunicação para o programa gnuplot e, em seguida, enviar os números armazenados em matrizes com formatação especial. Neste exemplo, o comando tem o formato - plot '-' u 1:2 t 'Price' w lp, seguido pelos elementos de dados e finalmente terminado com o caractere e. Cada inteiro deve ser separado com espaço e passado com um formato semelhante ao arquivo de entrada do exemplo anterior. Assim, utilizamos a função fprintf para escrever texto formatado no fluxo de tubos gnuplot. Observe que, os fluxos de arquivos abertos com a chamada popen devem ser fechados com a função 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