Como traçar dados em C
-
Use a função
gnuplot
para verificar o indicador de fim de arquivo no fluxo de arquivos -
Use a função
popen
para transmitir dados do gráfico para o processognuplot
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);
}
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