gnuplotでデータファイルをプロットするときの列の指定について(using)

gnuplotでデータファイルのデータをグラフとしてプロットするとき
gnuplot> plot 'test01.dat' using 1:2
のように「using」を用いてプロットに用いる列を指定します。
指定方法としては上のような列番号を指定する以外に、いくつかの指定方法があります。

指定方法は大まかに分類すると以下のようになっています。
  • 列番号で指定 : using 1:2
  • 列ラベル(1行目)で指定 : using "first":"second"
  • 同上 : using (column("first")):(column("second"))
  • 1列目を擬似的な列として指定 : using 0:1
  • 0:1の省略した書き方 : using 1
  • 固定した数値を指定 : using 1:(5)
  • 列に対して演算する場合 : using ($1):($2)
  • 演算したものを列に割り当てる指定 : using 1:($2+$3+$4)
  • 条件演算子を用いた指定 : using 1:($2<5 ? $2 : 0)
  • データファイルを読み込むときの書式フォーマット指定 : using 1:2 '%lf,%lf'
以下、ピックアップして解説していくことにします。

列番号で指定 : using 1:2

列番号での指定ですが、番号は1から始まる値で指定していきます。
(後述しますが0は別の意味を持ちます)
列番号の指定はシンプルなのであまり困ることはないと思いますが、データファイルの列区切りがスペース以外(カンマなど)だとちゃんと指定してもうまく認識されないことはあるでしょう。gnuplotではスペース区切りを基本としているので、それ以外のデータファイルでは設定を行ってからプロットして下さい。
以下、区切りについて簡単に解説したブログ記事です。

列ラベル(1行目)で指定 : using "first":"second"

データファイルの一行目に列ラベルがある場合、それを指定することでプロットすることも出来ます。例えば次のような中身のデータファイルの場合
a b c
1 3 10
2 4 20
3 1 15
4 9 22

列ラベルを指定してプロットする場合は次のようなコマンドになります。
gnuplot> plot 'test04.dat' using "a":"b" w l

ただ一行目の先頭に「#」がある場合は列ラベルとしては認識されないようです。データファイルでは列ラベルをコメントアウトとして扱うために先頭に「#」を付けた書き方がされる場合がよくあります。コメントアウトされている場合でも何かしらの方法が用意されているかも知れないので、何かわかったらまたブログで書こうと思います。

1列目を擬似的な列として指定 : using 0:1

データファイルに行番号のような連番の列がない場合、擬似的な連番の列を指定することが出来ます。例えば以下のような内容のデータファイルをプロットするときに役に立つでしょう。
30.1 20.5
24.3 11.2
11.6 15.8

これはpseudocolumnsという仕組みの一つで、列の指定に「0」を用いることで使用出来ます。連番は0, 1, 2, 3...と0から始まる値が使われます。

0:1の省略した書き方 : using 1

一つだけ列番号を指定すると、自動的にusing 0:1のように扱われるようです。

固定した数値を指定 : using 1:(5)

あまり利用する機会は無さそうですが、列を固定した数値としてプロットすることが出来ます。
using 1:(8)
とすればyの値がすべて8としてプロットされます。
一体何に使えばいいのか悩む指定方法ですが、応用的なプロットをするときに便利なようです。

列に対して演算する場合 : using ($1):($2)

上の固定した数値でプロットする指定方法でも使いましたが、usingで括弧「()」を使って閉じると特殊な意味として扱うことが出来ます。
using ($1):($2)

using 1:2
と同じプロットになります(同じと書きましたが、欠損データファイルの扱いが異なるかも?)。
そしてこの指定方法では、さらに列に対して演算した結果に置き換えてプロットすることも出来るようになります。

演算したものを列に割り当てる指定 : using 1:($2+$3+$4)

列に対する演算として、第二列〜第四列の和をプロットしたい場合は以下のように書くことが出来ます。
using 1:($2+$3+$4)
またsin関数の引数として列を指定することと以下のようになります。
using 1:(sin($2))
試してはいませんが、gnuplotに用意されている関数や演算子が使えるでしょう。

条件演算子を用いた指定 : using 1:($1<3 ? $2 : 0)

条件演算子とはなんぞや?と言うと、自分でもあまり使ったことはないですが、例えば
using 1:($1<3 ? $2 : 0)
のように指定すると、1列目が3未満では 1:($2)としてプロットし、3以上では 1:(0) としてプロットしたグラフが描けます。

データファイルを読み込むときの書式フォーマット指定 : using 1:2 '%lf,%lf'

usingでは列を指定する他に、データファイルを読み込むときの書式設定(フォーマット)の指定も出来ます。フォーマットとしてはC言語のscanfの書式が使えるようです。
カンマ区切りのデータファイルの読み込みは「set datafile separator」で指定出来ますが、
using 1:2 '%lf,%lf'
としても同じように指定出来ます。フォーマットを指定出来ると言ってもあまり使う機会が思い浮かびませんが、データファイルで特殊な読み込みが必要な場合に役に立つのかなと思います。


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



Amazon データ解析関連書籍など

コメント

スポンサーリンク


このブログの人気の投稿

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

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

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

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

Pythonのformat()を使って1桁の16進数でも2桁で出力する方法