C 言語でデータをプロットする方法

胡金庫 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 プログラムに配信されるようにし、最後に 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);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook