読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

gnuplotで簡単に色を指定するためのちょっとしたTips

目的

gnuplotlc rgb ... で自由に色を指定したいけどいちいち色の名前や 16 進法表示を調べるのがめんどくさい.できれば統一感のある色使いをしたいので HSV で色を指定したい.

解決方法

色を指定するための関数を書いた.

### convert (r,g,b) to #RRGGBB
rgb(r,g,b) = sprintf("#%02x%02x%02x",r%256,g%256,b%256);
### convert (h,s,v) to #RRGGBB
hsv_hi(h) = floor((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(r,g,b)

0—255 までの整数値 r,g,b を引数にとって 16 進表示で色を返す関数.

gnuplot> print rgb(255,0,0)
#ff0000
hsv(h,s,v)

整数値 h,s,v を引数にとって対応する色を RGB の 16 進表示で返す関数.h は 0—360 まで,s,v は 0—255 までの値をとる.想定外の値を入れると変な値を返すかもしれない.そういうことはやらない.

gnuplot> print hsv(0,255,255)
#ff0000
つかってみる

下記のようなテストスクリプトで冒頭のようなプロットができる.

#!/usr/bin/gnuplot

load '/path/to/color.gp'

set xr [0:(2*pi)]
set xtics format "%2.0f"
set ytics format "%3.1f"
set title "f(x,a) = sin(x+pi*a)" font ",14" offset 6,1
set key outside right
f(x,a) = sin(x+pi*a)

plot \
    f(x,0.0) lw 2 lc rgb hsv(  0,127,255), \
    f(x,0.1) lw 2 lc rgb hsv( 20,127,255), \
    f(x,0.2) lw 2 lc rgb hsv( 40,127,255), \
    f(x,0.3) lw 2 lc rgb hsv( 60,127,255), \
    f(x,0.4) lw 2 lc rgb hsv( 80,127,255), \
    f(x,0.5) lw 2 lc rgb hsv(100,127,255), \
    f(x,0.6) lw 2 lc rgb hsv(120,127,255), \
    f(x,0.7) lw 2 lc rgb hsv(140,127,255), \
    f(x,0.8) lw 2 lc rgb hsv(160,127,255), \
    f(x,0.9) lw 2 lc rgb hsv(180,127,255), \
    f(x,1.0) lw 2 lc rgb hsv(200,127,255), \
    f(x,1.1) lw 2 lc rgb hsv(220,127,255), \
    f(x,1.2) lw 2 lc rgb hsv(240,127,255)
###
注意

僕の環境は gnuplot 4.6.1 なのでこれよりもバージョンが古いとここで記述している関数は動かない可能性があります.具体的には sprintffloor が使えないと関数は動きません.

print sprintf("pi=%.0f",3.141516)
print floor(3.141516)

上記のコマンドを入力してエラーが出なければ大丈夫です.