Skip to content

Configurations in ~/.gnuplot

現在は Linux Mint 18.1 にて gnuplot 5.2 patch 2 を使用しています. ホームディレクトリに ~/.gnuplot を作成して起動時に以下のコマンドを実行しています.

# gnuplot startup script
set terminal wxt font 'Ubuntu,14'
set colorsequence podo
set timefmt "%Y-%m-%dT%H:%M:%S"
set encoding iso
set bar 0
set xyplane 0.05

set colorsequence podo を実行することで色覚の多様性を考慮に入れた配色パターンが採用されます. もちろん, 色だけでなく線種やシンボルの形状でも見分けられるようにするべきですが, デフォルトで podo を採用しておいて悪いことはないと思います.

他には timefmt を ISO 8601 拡張形式に指定, キャラクターコードを ISO-8859-1 に指定, エラーバーの上下のひげを削除, 3 次元プロットしたときに空間を有意義に使えるように \(x\)y-plane の値を調整, といった設定をしています.

また, これ以外にもいくつかの関数を定義して使用しています.

Color settings

gnuplotrgb(r,g,b) あるいは hsv(h,s,v) で色指定をするための補助関数を定義したスクリプトです.

### convert (r,g,b) to #RRGGBB
rgb(r,g,b) = sprintf("#%02x%02x%02x",int(r)%256,int(g)%256,int(b)%256);
### convert (h,s,v) to #RRGGBB
hsv_hi(h) = floor((int(h)%361)/60.)%6
hsv_f(h) = (h/60.)-floor(h/60.)
hsv_p(s,v) = floor(v*(1.-(s/255.))+0.5)
hsv_q(h,s,v) = floor(v*(1.-(s/255.)*hsv_f(h))+0.5)
hsv_t(h,s,v) = floor(v*(1.-(s/255.)*(1.-hsv_f(h)))+0.5)
hsv(h,s,v) = hsv_hi(h)==0?rgb(v,hsv_t(h,s,v),hsv_p(s,v)):\
             hsv_hi(h)==1?rgb(hsv_q(h,s,v),v,hsv_p(s,v)):\
             hsv_hi(h)==2?rgb(hsv_p(s,v),v,hsv_t(h,s,v)):\
             hsv_hi(h)==3?rgb(hsv_p(s,v),hsv_q(h,s,v),v):\
             hsv_hi(h)==4?rgb(hsv_t(h,s,v),hsv_p(s,v),v):\
             rgb(v,hsv_p(s,v),hsv_q(h,s,v))
###

RGB function

関数 rgb(r,g,b) は r, g, b にそれぞれ 0..255 の整数をとる関数です. (r,g,b) の組で指定された色を 16 進数の #RRGGBB 文字列に変換します. line color に指定する際には以下のように使用します.

plot x w l lc rgb rgb(150,150,255)

rgb 関数による色指定.

HSV function

関数 hsv(h,s,v) は h に 0..360 の整数, s,v にそれぞれ 0..255 の整数をとる関数です. (h,s,v) の組で指定された色を 16 進数の #RRGGBB 文字列に変換します.

plot x w l lw 2 lc rgb hsv(30,120,255)

hsv 関数による色指定.

Viridis colormap

Python の matplotlib などで使用されている viridis というカラーマップをインポートしています. viridis は Berkeley Institute for Data Science によって提供されているカラーマップのひとつです. gnuplot で読み込めるように形式を変換したファイルが [gnuplot-palettes][plattes] で公開されています. viridis.pal をダウンロードして load しています.

Mathematics

max/min functions

2 変数のうち大きい方 or 小さい方を返す関数です. 三項演算子を使えばいいですが記述がシンプルになるので定義しています.

min(x,y) = ((x<y)?(x):(y))
max(x,y) = ((x>y)?(x):(y))

log2(x)

log(x), log10(x) は定義されていたのでなんとなく.

log2(x) = log(x)/log(2.0)

Random variable

Box-Muller 法を使用して正規分布に従う乱数を生成する関数です.

# random variable from a Normal distribution
randn(u,s) = u + cos(2*pi*rand(0))*sqrt(-log(1-rand(0)))*s

以下では datablock を使用して定義したデータ列 $random を表示しています.

set print $random
do for [n=0:1000] { print randn(10,3) }
set print
plot $random

乱数 randn によって生成したデータ列.

Astronomy

Blackbody function

黒体輻射を定義しています. blackbody_nu(nu, T) は周波数 (Hz) と温度 (K) を引数にとる関数です. flux density は Jy 単位で与えられます. blackbody_lam(lambda, T) は波長 (µm) と温度 (K) を引数に採る関数です. flux density は W/m2/µm/str で与えられます.

astro_h  = 6.626068e-34   # planck constant
astro_kB = 1.3806503e-23  # boltzmann constant
astro_c  = 2.99792458e8   # the speed of light

jansky_to_watt(nu, f) = \
  f*(nu**2/astro_c)*1e-6  # in units of W/m^2/um/str

## Blackbody function in units of Jy
blackbody_nu(nu, T) = \
  2.0e26*(astro_h/astro_c**2)*(nu**3)/(exp(astro_h/astro_kB*nu/T)-1.0)

## Blackbody function in units of W/m^2/um/str
blackbody_lam(lambda, T) = \
  (lum=1e-6*lambda,jansky_to_watt(astro_c/lum,blackbody_nu(astro_c/lum,T)))

それぞれの関数の使い方を以下のサンプルに示しました.

set log x
set log y
set key bottom right
set multiplot layout 1,2

set xr [1000*1e12:10*1e12]
set xlabel "Frequency (Hz)"
set ylabel "Flux density (Jy)"
plot blackbody_nu(x, 3000)

set xr [0.1:100]
set xlabel "Wavelength ({\265}m)"
set ylabel "Flux density (W/m^2/{\265}m/str)"
plot blackbody_lam(x, 3000)

unset multiplot

黒体輻射関数の使用例