GNUPLOT

- not so Frequently Asked Questions -

update 2004/12/18

2次元プロットのあれこれ (その7)

1 | 2 | 3 | 4 | 5 | 6 | 7

正規確率軸を用いた図の表示.

from Dr. Moriyama. Thanks !

粉体やエアロゾルなど粒子を扱う分野では, 累積体積割合 vs 粒径のプロッ トをよく描きます. 粒子径の対数をとったものの分布はある値を中心に正 規分布するケースが多く, 「正規確率軸」と呼ばれる軸がしばしば使われ ます.gnuplotには正規分布norm()とその逆関数invnorm()があります ので,これらを用いて正規確率軸を描くことができます.同様の方法を用いて 種々の関数でスケールされた図を描く事ができるでしょう.

gnuplot> set ytics ("0.1" invnorm(0.001),"1" invnorm(0.01),"5" invnorm(0.05),\
>          "10" invnorm(0.1),"20" invnorm(0.2),"30" invnorm(0.3),\
>          "40" invnorm(0.4),"50" invnorm(0.5),"60" invnorm(0.6),\
>          "70" invnorm(0.7),"80" invnorm(0.8),"90" invnorm(0.9),\
>          "95" invnorm(0.95),"99" invnorm(0.99),"99.9" invnorm(0.999))

gnuplot> set yrange [invnorm(0.0001):invnorm(0.9999)]
gnuplot> set ylabel "Cumulative mass fraction (%)"
gnuplot> set xlabel "Diameter (mm)"
gnuplot> set logscale x
gnuplot> set grid
gnuplot> plot "sample.dat" using 1:(invnorm($2)) notitle w lp
fig/sample5.17a

この例では,データが対数正規分布をしていると考えているため,X軸に対 数目盛をとっています.データが実際にこの分布に従う場合,表示される グラフは直線になります.


up

データ点の位置に数値を書き込みたい.

from Jon, Thanks !

点データを表示する際,その位置に数値を書いておけば,後で数値を読み取 るのが簡単になります.普通はグラフから直接数値を読み取ることは無いと思い ますが,そのような需要がある図では,考えてもよいかもしれません.

残念ながら,Gnuplotはデータファイルの数値をテキストとして表示するこ とはできませんので,数値を何か別のプログラムで読み取り, set label を使って表示することになります.次のようなデータがあるとし,この データを点で表示して,その位置に数値を書き込みます.

0.40  80
3.00  70
3.00  60
6.00  50
9.00  40
12.00  30
13.00  20
5.00  20
8.00  20

直接gnuplotだけでは出来ないので,まずperlを使って, label コマンドを自動作成します.gnuplotで必要になるのは,次のような行です.

gnuplot> set label "(0.4,80)" at 0.4,80
gnuplot> set label "(3.0,70)" at 3.0,70

このような文は,Perlを使って書き出すことができます.

% perl -ane 'print "set label \"($F[0],$F[1])\" at $F[0],$F[1]\n"' file.dat > label.plt

このようにして作られたgnuplotのコマンドをplot時に読み込めば,データ 点位置に,その数値のラベルが付けられます.

gnuplot> load "label.plt"
gnuplot> plot 'file.dat' u 1:2 smooth csp with lines ,\
>             'file.dat' u 1:2 w points
fig/sample5.18
up