gnuplot : 線プロット(lines)で線がぐちゃぐちゃに結ばれてしまう場合の対処(Piped-dataを用いる)
線プロットで線がぐちゃぐちゃに結ばれてしまう
gnupotでデータファイルを線プロット(lines, linespoints)するとき、線の結び方がぐちゃぐちゃになってしまうことが起こりえます。例えば、以下のようなグラフ。線がぐちゃぐちゃに結ばれてしまう例 |
これはちゃんと結ばれていれば以下のグラフのようになるはずのものです。
通常の線プロットの例 |
なぜ線がぐちゃぐちゃに結ばれてしまうか
線プロットで線がぐちゃぐちゃになってしまうのは、データファイルのデータ並びが関係します。gnuplotでは線プロットの線の結び方はデータの並び順となります。データの数値の大きさではなく。データの並び方と線の結び方の関係について
データの並び方、簡単な例で説明すると通常は以下のようになっているでしょう。1 1
2 5
3 1
4 5
5 1
1列目がx軸、2列目がy軸のデータで、行が進むごとにx軸の大きさが小さい方から大きい方になるように並びます。これをプロットすると以下のようになります(分かりやすいようlinespointsでプロットしています)。
通常のデータ並びのグラフ例 |
この場合は特に問題はなく、通常通りの線プロットになります。では、次に同じデータを用いてデータの並びを以下のように適当に入れ替えてみます。
3 1
5 1
2 5
4 5
1 1
これをプロットすると以下のようになります。ぐちゃぐちゃに線が結ばれるのが見て取れます。
データ並びを入れ替えた場合のグラフ例 |
データ点数が少ないのでそれほどぐちゃぐちゃにはなっていませんが、これがもっとデータ点数が多くなると一番始めに説明したグラフのようになるわけです。また、このグラフを見て分かるように、x=3の次がx=5、その次がx=2というようにデータの並びに沿って線が結ばれているのがわかります。あえてこういう結び方をしたい場合はともかくとして、通常通りに線を結びたい場合はデータ並びを修正する必要があります。
以上より、通常通りの線の結び方にしたい場合は、データの並びを数値の大きさ順で並び替えてやればいいことがわかります。
データ並びを修正する
データファイルのデータ並びを修正するには、表計算ソフトやコマンドラインツールで処理してやればいいでしょう。ただこの場合、一旦他のソフトでデータファイルの処理をする手間が生じてしまいます。なので、ここでgnuplot側だけで済ませる方法について簡単に解説しておきます(外部コマンド呼び出し機能を用いるのでgnuplotだけという方法ではありません)。gnuplotでデータ並びを修正(Piped-data機能でsortコマンドを用いる)
gnuplotでデータファイルのデータ並びを修正する方法として、以前解説したPiped-dataという機能を用います。簡単にPiped-dataについて解説すると、gnuplot側で呼び出した外部コマンドの出力結果をそのままデータファイルとして認識してプロットするという機能です。
(外部コマンドを用いるという性質上、システム側に用いたい外部コマンドがあることが前提となります)
データ並びを修正することが出来るコマンドはいくつもありますが、今回は簡単に"sort"というコマンドを使うことにします(もう少し詳しく言うとGNU coreutilsのsortコマンド)。
まず、Piped-data機能を用いてsortコマンドでデータファイル(data01.dat)のデータ並びを修正するには以下のようになります。
gnuplot> plot "<sort data01.dat" with linespoints linecolor "blue" linewidth 2
ただしこのコマンドのままでは数値順の並び替えとはなりません。sortコマンドをオプション無しでデータ並びを修正しようとすると、数値の大きさ順では並びません(簡単に言うと10が2より小さく扱われるという話)。sortコマンドで数値の大きさで並べるには"-n"オプションを用います。ということでオプションを付けて書き直すと以下のようになります。
gnuplot> plot "<sort -n data01.dat" with linespoints linecolor "blue" linewidth 2
扱うデータファイルによってはデータセパレーターの指定や先頭行のコメントスキップ、ソートする列の指定などのオプション指定も必要になるでしょう。必要に応じて別途調べてみて下さい。
(補足)その他のデータ並びを修正する方法
Piped-data機能以外にデータ並びを修正してプロットする方法として、smooth機能でuniqueを指定するというものもあります。ただ、この方法では同じXの値のデータが複数あると、値が平均した点で線が結ばれます。そのためやや扱い難いと思われるので、ここでは詳しくは説明しないこととします。gnuplot関連のブログ記事
コメント
コメントを投稿