C에서 데이터를 그리는 방법

Jinku Hu 2023년10월12일
  1. gnuplot기능을 사용하여 파일 스트림에서 파일 끝 표시기 확인
  2. popen함수를 사용하여 플롯 데이터를gnuplot프로세스로 스트리밍
C에서 데이터를 그리는 방법

이 기사에서는 C로 데이터를 그리는 방법에 대한 몇 가지 방법을 설명합니다.

gnuplot기능을 사용하여 파일 스트림에서 파일 끝 표시기 확인

gnuplot은 플롯을 표시하고 파일로 저장하는 데 사용할 수있는 강력한 플로팅 프로그램입니다. 일반적으로 다음과 같이 각 열이 단일 공백으로 구분되는 단순 열 기반 형식의 파일 데이터 세트와 함께 사용됩니다. 이 예에서는popen 함수를 사용하여 명령을gnuplot 프로그램으로 스트리밍하고 별도의 파일에 저장된 데이터를 플로팅합니다. gnuplot 문서는이 페이지에서 읽을 수 있습니다. 이 경우 사용법을 보여주기 위해 가장 간단한 명령 만 사용할 것입니다.

plot명령은 플롯을 처리하고 렌더링하기 위해 다른 인수와 매개 변수를 사용하는 핵심 부분입니다. 꺾은 선형 차트로 그려야하는 2 개의 숫자 열이있는 파일을 제공합니다. 명령의 형식은plot 'input.txt' t 'Price' w lp이며,fprintf를 사용하여 구성되고popen호출에서 반환 된 파일 스트림 포인터에 기록됩니다. 명령에서t지정자는 제목의 약칭이며 차트 스타일을 나타내는w-with키워드입니다. 이 경우lp(라인 포인트) 스타일이 선택되어 특정 기간 동안 여러 가격 포인트를 나타냅니다. 데이터가gnuplot프로그램으로 전달되도록 스트림을 명시 적으로fflush하고 마지막으로getchar함수로 프로그램을 일시 중지하여 사용자가 플롯을 닫을 때까지 플롯이 표시되도록합니다.

#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);
}

입력 파일 형식 :

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

popen함수를 사용하여 플롯 데이터를gnuplot프로세스로 스트리밍

또는 이전에 저장된 데이터를 프로그램 메모리에서 직접 별도의 파일로 스트리밍 할 수 있습니다. popen기능은gnuplot프로그램에 대한 파이프 통신을 열고 특수 형식으로 배열에 저장된 숫자를 전송하는 데 다시 사용됩니다. 이 예에서 명령의 형식은plot '-' u 1:2 t 'Price' w lp뒤에 데이터 요소가오고 마지막으로e문자로 끝납니다. 각 정수는 공백으로 구분하고 이전 예제의 입력 파일과 유사한 형식으로 전달해야합니다. 따라서fprintf함수를 사용하여 형식화 된 텍스트를gnuplot파이프 스트림에 기록합니다. popen호출로 열린 파일 스트림은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);
}
작가: 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