gnuplotで一つのデータファイルにある複数のデータ系列をプロットする方法(index)

データファイルと言えば基本的には一つのファイルに一つのデータ系列が入っています。
列が複数、3つ以上の場合はusingでいくつかの列を別個に扱うということもしますが、今回はそれとは違う話。

複数のデータ系列が含まれるデータファイル

今回扱うのは一つのデータファイルに以下のようなデータが入っている場合についてです。
1 3
2 1
3 5
4 2

3 7
4 3
5 2

1 9
3 6
5 5

一つのファイルに3つのデータ系列がそれぞれ一つの空行を挟んで分かれているといった形になっています。
このようなデータファイルを作ること自体あまり無いかも知れないですが、例えばいくつもファイルを作っておきたくない場合や、データファイルをテキストエディタで開きっぱなしにして常にそこにデータを書き込んでいく場合などではこういう扱いも便利といえば便利です。

実際にこのデータファイルをプロットしてみると以下のグラフになります。
データファイルに書き込んである3つのデータ系列が別々のラインとしてプロットされます。

個々のデータ系列を別個のものとして扱うには?

さて、これはこれでデータを比較したりするには便利なのですが、データ系列が多くなった場合、プロットされるラインが全部同じ色や線だと分かり難くなってきます。
ここではプロットするコマンド自体は以下のようになっています。
gnuplot> plot 'gptest01.dat'  with linespoints lw 2
では各データ系列において別々の線種を使いたい場合はどのようにすればいいのでしょう?
それにはgnuplotに対して個々のデータ系列を、それぞれ別個のものとして識別させる必要があります。簡単にはデータ系列ごとに別々のファイルに分離してプロットしてやるのが手っ取り早いのですが、gnuplotではそうしなくとも一つのファイルだけでも別個のものとして認識させることが出来ます。

"index"オプション

認識させるには "index" というオプションを用います。
このオプションの使い方としては、ファイル名指定の後にindex、そして何個目のデータ系列をプロットするかを指定します。なお番号は0から始まるため、1個目のデータ系列の場合は"index 0"、3個目のデータ系列の場合は"index 2"という指定になります。

では、例のデータファイルについて2個目のデータ系列をプロットしてみます。
コマンドは以下のようにしました。
gnuplot> plot 'gptest01.dat' index 1 with linespoints lw 2
しかし、残念ながらこのプロットを実行しても以下のようなエラーメッセージが出てエラーとなります。
         warning: Skipping data file with no valid points
                                                         ^
         x range is invalid

これは何故かというと、そもそもデータファイルの型式がindexで指定できる型式とはなっていないためです。指定出来るようにするには、データファイル内のデータ系列の区切りに2つの空行が必要となります。例として上げているデータファイルの区切りの空行は1行のみなので、indexで指定してもエラーになったというわけです。

ということで、データ系列のそれぞれの区切りを以下のように空行を2つになるように修正してプロットしてみます。
1 3
2 1
3 5
4 2


3 7
4 3
5 2


1 9
3 6
5 5

コマンド自体は先程と同じ。
gnuplot> plot 'gptest01.dat' index 1 with linespoints lw 2
すると以下のプロットとなります。"index 1"と指定しているので2番目のデータ系列がプロットされました。
このようにindexオプションを用いることで、一つのデータファイル内の特定のデータ系列のみプロットすることが出来るわけです。
indexオプションは一つのデータ系列を指定するだけでなく、"index 1:3" のように指定すれば2個目から4個目までプロットするという指定も出来ます。

線種を変えてプロット

では、例に戻って実際に線種を変えてプロットしてみます。
gnuplot> plot 'gptest01.dat' index 0 with lp lt 4 lw 2, '' index 1 with lp lt 2 lw 3, '' index 2 with lp lt 3 lw 2
(一つのプロットコマンドで同じデータファイルを指定する場合、2個目のファイル名からは '' を使うことで記述を省略出来ます)
すると、このように3つのデータ系列ごとに別々の線種を指定することが出来ました。
データファイルの扱いにおいて、このような方法も使えるということを覚えておくと何かと便利になるかと思います。


forループと合わせた使い方

ちなみにデータ系列それぞれについて設定を記述しなくとも、プロットコマンドでforループを用いてまとめて設定することも出来ます。
gnuplot> plot for [i=0:2] 'gptest01.dat' index i with lp lt i lw 3
"i"を変数とすることでデータ系列とlinetypeの設定を変えながらプロットするというわけです。
また、データ系列をどんどん追記していくと最後のデータ系列が何個目かを把握するのが面倒になりますが、以下のように"*"記号を用いると自動で最後まで指定することが出来ます。
gnuplot> plot for [i=0:*] 'gptest01.dat' index i with lp lt i lw 3



この記事に関連するブログ記事

gnuplotで疑似ファイル(pseudo-file)を使ったプロット方法 その1
gnuplotのplotでforループを使ったグラフプロット(plot for [i = ... )

その他、gnuplot関連のブログ記事

コメント

スポンサーリンク


このブログの人気の投稿

gnuplotでプロットなどの色をcolornameの指定で変更する

catコマンドの出力を行番号付きにするためのコマンドラインオプション(-n, -b)

Ubuntu Softwareが起動しないのでいろいろと調べてみる(Ubuntu 20.04.1 LTS)

gnuplot : グラフにグリッド線を描く方法(set grid)

gnuplot : プロット画像のサイズ指定について(set sizeとの違い)