いちからはじめる GMT その72 - makecpt -D -N

2013年 1月 1日 掲載


さて,今年も GMT の連載をはじめることとしよう. 正月から GMT を使う人もいないと思うが(いたらご愁傷様),GMT の記事は毎月一日に掲載することにしているので,年末年始に在宅の今年は元日の掲載となる. 新年一発目の記事は,makecpt のオプションである.


まずはサンプルのデータ作り…,の前に GMT のパラメータをリセットしておく.

$ gmtdefaults -D > .gmtdefauls4

では,あらためて. AWK を使って,1.2cos(x)cos(y) の値 cc.txt を計算し,xyz2grd で grdファイル cc.grd にする.

$ awk 'BEGIN{for(x=-4;x<=4;x+=0.125)for(y=-4;y<=4;y+=0.125)print x,y,cos(x)*cos(y)*1.2}' > cc.txt
$ xyz2grd cc.txt -Gcc.grd -R-5/5/-5/5 -I0.125

ここで,cc.txt と cc.grd の x, y の範囲が違うのは,わざとである.

これを grdimage で図化する.カラーパレットは赤青の polar を使おう.

$ makecpt -Cpolar -Z > p.cpt
$ grdimage cc.grd -Jx1 -Cp.cpt -Ba2 > cc.eps

1.2cos(x)cos(y)

へんてこな図になった.ま,わざとなんだけど. 変なところは 3つある.

これらの色が変な部分は,いろいろと範囲外のところなのである. まずは,元データ cc.txt の範囲を確認しておこう.

$ minmax cc.txt
cc.txt: N = 4225	<-4/4>	<-4/4>	<-1.19983/1.2>

<-4/4>, <-4/4>, <-1.19983/1.2> が x, y, z の範囲になる.

grdファイル cc.grd の情報は,grdinfo で得ることができる.

$ grdinfo cc.grd
cc.grd: Title: cc.grd
cc.grd: Command: xyz2grd -R-5/5/-5/5 -I0.125 cc.txt -Gcc.grd
cc.grd: Remark: 
cc.grd: Gridline node registration used
cc.grd: Grid file format: nf (# 18) GMT netCDF format (float)  (COARDS-compliant) [DEFAULT] 
cc.grd: x_min: -5 x_max: 5 x_inc: 0.125 name: x nx: 81
cc.grd: y_min: -5 y_max: 5 y_inc: 0.125 name: y ny: 81
cc.grd: z_min: -1.19983005524 z_max: 1.20000004768 name: z
cc.grd: scale_factor: 1 add_offset: 0

x, y, z の範囲は,

cc.grd: x_min: -5 x_max: 5 x_inc: 0.125 name: x nx: 81
cc.grd: y_min: -5 y_max: 5 y_inc: 0.125 name: y ny: 81
cc.grd: z_min: -1.19983005524 z_max: 1.20000004768 name: z

の部分である.

最後に,カラーパレット p.cpt を見てみる.

$ cat p.cpt
#	cpt file created by: makecpt -Cpolar -Z
#COLOR_MODEL = RGB
#
-1	0	0	255	0	255	255	255
0	255	255	255	1	255	0	0
B	0	0	0
F	255	255	255
N	128	128	128

「-1 0 0 255 0 255 255 255」の行が z = -1 〜 0 までの,「0 255 255 255 1 255 0 0」の行が z = 0 〜 1 までの RGB での色指定(値 R G B 値 R G B)である.

それぞれの範囲を整理して表にすると,

ファイル x の範囲 y の範囲 z の範囲
cc.txt -4 ≦ x ≦ 4 -4 ≦ y ≦ 4 -1.2 ≦ z ≦ 1.2
cc.grd -5 ≦ x ≦ 5 -5 ≦ y ≦ 5 -1.2 ≦ z ≦ 1.2
p.cpt - - -1 ≦ z ≦ 1

となっている.

まず,cc.txt と cc.grd をくらべると,cc.grd の方が x, y の範囲が広い. 元データがない cc.grd のこの部分には値が入っていない. 当然,この部分はふつうには描画できないことになる.

次に,cc.grd と p.cpt をくらべてみよう. p.cpt の z の範囲が cc.grd よりもせまい. z < -1 と z > 1 の部分はやっぱりふつうには色がぬれない.

こういう部分の色の指定は,p.cpt の最後の 3行,

B	0	0	0
F	255	255	255
N	128	128	128

でなされている.

である. p.cpt には,それぞれ黒色(0 0 0),白色(255 255 255),灰色(128 128 128)が入っているので,上のような図になってしまうのだ.

さて,これを何とかしたい. ふつうに考えたら,z > 1 は z = 1 の色の「赤」で,z < -1 は z = -1 の色の「青」でぬってほしいだろう. makecpt に -Dオプションをつけるとそうしてくれる.

$ makecpt -Cpolar -Z -D > p.cpt
$ grdimage cc.grd -Jx1 -Cp.cpt -Ba2 > cc.eps

1.2cos(x)cos(y)

p.cpt を確認すると,B と F の値が青(0 0 255)と赤(255 0 0)に変わっているのがわかる.

$ cat p.cpt
#	cpt file created by: makecpt -Cpolar -Z -D
#COLOR_MODEL = RGB
#
-1	0	0	255	0	255	255	255
0	255	255	255	1	255	0	0
B	0	0	255
F	255	0	0
N	128	128	128

grdファイルに値がない部分の N の色は,makecpt のオプションでは指定できないようだ. gmtset で COLOR_NAN の値を変えてから,カラーパレットを作らなくてはならない. COLOR_NAN の値は,デフォルトでは,

$ gmtdefaults -D | grep "COLOR_NAN"
COLOR_NAN		= 128

となっている. 128 は,モノクロ 256階調での灰色の色指定の仕方である. 印刷するときインクがもったいないので white に変えよう.

$ gmtset COLOR_NAN white
$ makecpt -Cpolar -Z -D > p.cpt
$ grdimage cc.grd -Jx1 -Cp.cpt -Ba2 > cc.eps

1.2cos(x)cos(y)

B, F の値も,同じようにして自由に変えることができる. B の値に使いたい値を COLOR_BACKGROUND,F の値に使いたい値を COLOR_FOREGROUND にセットしてから,カラーパレットを作ればよい. このとき,makecpt に -Dオプションはつけないように.

$ gmtset COLOR_BACKGROUND cyan
$ gmtset COLOR_FOREGROUND magenta
$ makecpt -Cpolar -Z > p.cpt
$ grdimage cc.grd -Jx1 -Cp.cpt -Ba2 > cc.eps

1.2cos(x)cos(y)

makecpt に -Nオプションをつけると,B, F, N の値がカラーパレットファイルに書かれなくなる.

$ makecpt -Cpolar -Z -N > p.cpt
$ cat p.cpt
#	cpt file created by: makecpt -Cpolar -Z -N
#COLOR_MODEL = RGB
#
-1	0	0	255	0	255	255	255
0	255	255	255	1	255	0	0

grdimage などの GMT のコマンドは,このようなカラーパレットファイルが指定されたとき,COLOR_BACKGROUND, COLOR_FOREGROUND, COLOR_NAN の値を直接使う. ためしてみよう.

$ grdimage cc.grd -Jx1 -Cp.cpt -Ba2 > cc.eps

1.2cos(x)cos(y)

$ gmtset COLOR_BACKGROUND red
$ gmtset COLOR_FOREGROUND blue
$ gmtset COLOR_NAN lightgray
$ grdimage cc.grd -Jx1 -Cp.cpt -Ba2 > cc.eps

1.2cos(x)cos(y)

B, F, N の値を変えたカラーパレットファイルを作っておいてもいいし,B, F, N の値のないカラーパレットにしておいて,後で gmtset でいろいろ変えてもいい. 後者が便利な場合というのは,ちょっと思いつかないが,何か使い道があるのだろう.

最後に gmtset でいろいろいじったのをリセットして,今回はおしまいにしよう.

$ gmtdefaults -D > .gmtdefaults4

[ KDOホームにもどる] [ いちからはじめる GMT インデックスにもどる ]


(C) 2013 KDO