C++ Gnuplot グラフ 保存

ゆうき( @BASEBALLY15 )です^^

どうしたんじゃ?

C++を使って,Gnuplotで作成したグラフをフォルダに保存する方法を教えて欲しいです.

了解じゃ!

具体的に何が出来るの?

この記事を最後まで読むと,

以下の画像の様に,C++を使って,テキストファイルのデータからGnuplotでグラフを作成し,フォルダに保存することが出来ます.

C++を使って,Gnuplotで作成したグラフをフォルダに保存した様子

それでは,早速,コードを見ていきましょう^^

開発環境を載せておくよ!

まず,C++を使って,Gnuplotで作成したグラフをフォルダに保存する際の環境を紹介します.

(※今回紹介する方法は,エディタやライブラリのバージョンが,以下のものと異なる場合でも使うことが出来ます.)

開発環境
OS     :Windows 10
エディタ :Visual Studio 2015
言語   :C++
ライブラリ:OpenCV 3.4.10

Gnuplotをダウンロードしよう!

Gnuplotをダウンロードしていない方は,まず以下のサイトへ移動して,ダウンロードしてください.

gnuplot ダウンロード
(画像をクリックすると,ダウンロード先に移動します.)

OpenCVを使えるように設定しよう!

今回紹介する方法では,OpenCVを使うため,OpenCVを使えるように設定していない方は,先に以下の記事を読むことをオススメします^^

C++を使って,Gnuplotで作成したグラフをフォルダに保存する方法とは?

それでは,早速,以下の流れで,Gnuplotで作成したグラフをフォルダに保存する方法をご紹介します.

流れ
1. 全体のコード について
2. 各コードの詳細 について

全体のコード

#include <iostream>
#include <string> //std::cinを使用
#include <opencv2/opencv.hpp>



struct Function
{
	int x;
	int y;
};



int main()
{
	std::vector<struct Function>all_function;
	struct Function function;


	std::cout << "Text File Name = " << std::endl;
	std::string TextFileName;
	std::cin >> TextFileName;
	

	std::ifstream input_file;
	input_file.open(TextFileName);


	while (1)
	{
		if (!input_file.eof())
		{
			input_file >> function.x;
			input_file >> function.y;

			all_function.push_back(function);
		}
		else
		{
			input_file.close();

			break;
		}
	}
	
	



	FILE *gid;
	gid = _popen("C:\\gnuplot\\bin\\gnuplot.exe", "w");


	fprintf(gid, "set size ratio -1\n");//xとyのメモリを1:1にする
	fprintf(gid, "set xlabel 'x'\n");//x軸のラベル
	fprintf(gid, "set ylabel'y'\n");//y軸のラベル



	fprintf(gid, "set terminal png\n");//gnuplotのグラフを保存する際の拡張子の指定
	fprintf(gid, "set output 'C:\\result_gnuplot\\pynumber0.png'\n");



	fprintf(gid, "plot '-' with lines title 'y=x'\n");


	for (int i = 0; i < (int)all_function.size(); i++)
	{
		fprintf(gid, "%d\t%d\n", all_function[i].x, all_function[i].y);
	}


	fprintf(gid, "set terminal windows\n");

	fprintf(gid, "set output\n");



	fprintf(gid, "e\n");
	fflush(gid);
	fprintf(gid, "pause mouse\n");
	fflush(gid);
	_pclose(gid);


	//今回は必要ない
	all_function.clear();     all_function.shrink_to_fit();



	return 0;
}

各コードの詳細

構造体を作成しよう!

struct Function
{
	int x;
	int y;
};

テキストファイルの各列の値を編集するために,構造体を作成します.

構造体を使うことで,int型やdouble型,char型など,複数の型を指定することが出来きます.

以下から,main()関数内の詳細を紹介します.

配列(vector)を用意しよう!

std::vector<struct Function>all_function;
struct Function function;

まず,

struct Function function;

と書くことで,

上で作成した『構造体(struct)』をメイン関数内で使えるようにします.

そして,

std::vector<struct Function>all_function;

と書くことで,下の図の様に,1行ずつ,値を配列に格納するための準備を行います.

配列 vector とは?

テキストファイルを読み込もう!

std::cout << "Text File Name = " << std::endl;
std::string TextFileName;
std::cin >> TextFileName;

std::ifstream input_file;
input_file.open(TextFileName);

まず,

std::cout << "Text File Name = " << std::endl;
std::string TextFileName;
std::cin >> TextFileName;

と書くことで,コマンドプロンプト上からテキストファイルを読み込むことが出来ます.

そして,

std::ifstream input_file;
input_file.open(TextFileName);

と書くことで,コマンドプロンプト上から読み込んだテキストファイルを,読み込み用として開くことが出来ます.

テキストファイルのデータをプッシュバックしよう!

while (1)
{
	if (!input_file.eof())
	{
		input_file >> function.x;
		input_file >> function.y;

		all_function.push_back(function);
	}
	else
	{
		input_file.close();

		break;
	}
}

処理を繰り返し行うために,

while (1)

と書きます.

そして,while文の中に,テキストファイル内のデータを読み込むためのコードを書きます.

if (!input_file.eof())
{
	input_file >> function.x;
	input_file >> function.y;

	all_function.push_back(function);
}

と書くことで,テキストファイル内のデータを最後までスキャンすることが出来ます.

ちなみに,

all_function.push_back(function);

は,1行ごとに読み込んだ値を,メイン関数の始めで定義した『all_function』という配列に格納しています.

また,

else
{
	input_file.close();

	break;
}

と書くことで,テキストファイル内のデータを全てスキャンし終わったら『input_file』を閉じて,while文から抜けるという処理を行います.

Gnuplotを使うために,ファイルポインタの宣言をしよう!

FILE *gid;
gid = _popen("C:\\gnuplot\\bin\\gnuplot.exe", "w");

Gnuplotのファイル操作を行うために,ファイル情報を示す変数を用意します.

ちなみに,ファイルポインタを宣言する際は,

FILE *変数名;

と書きます.(『*』を忘れないように!』)

そして,

gid = _popen("C:\\gnuplot\\bin\\gnuplot.exe", "w");

と書くことで,gnuplotのexeファイルを書き込み形式で開きます.

[Windows] C言語でgnuplotを動かす

出典元:Haruna MATSUSHITA Computational Intelligence Laboratory

保存する形式を指定しよう!(本題①)

fprintf(gid, "set terminal png\n");//gnuplotの結果を保存
fprintf(gid, "set output 'C:\\result_gnuplot\\number0.png'\n");

まず,1番目のコードで,グラフをフォルダに保存する際の画像の拡張子を指定します.

今回の場合,『.png』拡張子を指定しています.

次に,2番目のコードで,画像の保存先+画像名を指定します.

グラフを作成しよう!

fprintf(gid, "plot '-' with lines title 'y=x'\n");

for (int i = 0; i < (int)all_function.size(); i++)
{
	fprintf(gid, "%d\t%d\n", all_function[i].x, all_function[i].y);
}

まず,

fprintf(gid, "plot '-' with lines title 'y=x'\n");

で,グラフの表示形式を指定します.

with lines

で,ライン形式で表示します.

他の形式でグラフを表示したい場合は,以下のサイトが参考になります.

gnuplotによるグラフ作成7~プロットスタイル変更

出典元:つれづれなる備忘録

そして,

title 'y=x'

で,凡例を指定します.

グラフをフォルダに保存しよう!(本題②)

fprintf(gid, "set terminal windows\n");

fprintf(gid, "set output\n");

まず,

fprintf(gid, "set terminal windows\n");

で,出力先をwindowsに設定し,

fprintf(gid, "set output\n");

で,上で指定した画像をフォルダに保存します.

Gnuplotのファイルを閉じよう!

fprintf(gid, "e\n");
fflush(gid);
fprintf(gid, "pause mouse\n");
fflush(gid);
_pclose(gid);

全ての処理が終わったら,上記のコードを書いて,Gnuplotのファイルを閉じます.

これらは,おまじないのようなものなので(厳密には,それぞれ意味がありますが),Gnuplotを使う際には,毎回書いてください.

以上で,C++を使って,Gnuplotで作成したグラフをフォルダに保存することが出来ます!

終わりに

今回は,C++を使って,Gnuplotで作成したグラフをフォルダに保存する方法をご紹介しました.

Gnuplot単体でも,グラフをフォルダを保存することは出来るのですが,プログラミングを使うことで,より効率的に保存することが出来ます!

ぜひ,Gnuplotで作成したグラフを保存する際は,この記事で紹介した方法を参考にしてみて下さい^^

それでは,Goodbye!

Q &A

参考記事

Gnuplot このコマンドを書くだけでグラフを保存できる!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA