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