ここではお絵描きの設定について紹介します
NCLではWorkstationを設定しないと図が書けない。NCLで出せる図の種類はps,eps,pdf,png,X11である。以降,workstationの変数をwksとする。
wks = gsn_open_wks(type, filename)
〔入力変数〕
type
type = "X11" のように図の種類を設定。Resourcesを使わない場合 "X11" のように直接書いても良い。
filename
ファイル名を入れた変数(character)。" " で入れても良い。
〔出力変数〕
wks
graphic属性の値が返される。
Workstationの細かい設定は,gsn_open_wksの入力変数(上ではtype)に@でResourcesを加えていく形で設定していく。
type@wkPaperwidthF = 10 : 幅 type@wkPaperHeightF = 10 : 高さ
紙の大きさとして指定することもできる
type@wkPaperSize = "A4" : デフォルトはレターサイズ
type@wkOrientation = "potrait" : 横書き type@wkOrientation = "landscape" : 縦書き
type@wkVisualType = "monochrome" : デフォルトはcolor
他にも余白を指定したりできる。
指定したら,wks = gsn_open_wks(type, filename) とすればwksにその設定が組み込まれる。
以降,Resourcesを入れる変数をresとする。
XYプロットには,関数 gsn_csm_xy を用いる。
plot = gsn_csm_xy(wks, x, y, res)
基本的に散布図をつなげたものが描かれる。
例えば x = (/10,2,3/),y = (/1,2,3/)だったとすると、線は (10,1) → (2,2) → (3,3) を結んだ折れ線が引かれる。
x が1次元配列で,y が2次元配列の場合,同じxに対して複数のyがとられることになる(逆も同じ)。すなわち,x[m], y[n,m] の場合,同じxに対しn本のyの折れ線が引かれることになる。
x が2次元,y も2次元の場合,1対1に対応した複数の直線が引かれる。すなわち,x[n,m],y[n,m] の場合,x(1,m)とy(1,m),x(2,m)とy(2,m),... ,x(n,m)とy(n,m) のn本の直線が引かれることになる。
複数軸がある場合には以下の関数を使うことができる。
res@trXMaxF = 1.0 ; X軸の最大値 res@trXMinF = -1.0 ; X軸の最小値 res@trYMaxF = 1.0 ; Y軸の最大値 res@trYMinF = -1.0 ; Y軸の最小値
0以下の値があると使えない。maskすればOK
res@trXLog = True ; X軸を対数軸に res@trYLog = True ; Y軸を対数軸に
res@xyLineThicknesses = 1.0 ; 太さ res@xyDashPatterns = 0 ; 線種(線種ごとに割り当てられた整数で指定)
線種と整数の対応は以下を参照
http://www.ncl.ucar.edu/Document/Graphics/dash_patterns.shtml
※一部のresourceには~sと~Fがあるが,基本的には~sを使えば良い。~sは配列での指定にも対応しているという意味。~Fや~のみだと,複数本あったときの設定(1本目は赤、2本目は青など)ができない。
res@gsnYRefLine = 0 ; 指定したYの値のところに横線を引く(0にすればX軸が引かれる)。配列で複数指定可能。また, res@gsnYRefLineDashPatterns = (/1,0,1/) res@gsnYRefLineColors = (/"gray","black","gray"/) res@gsnYRefLineThicknesses = (/1,2,1/)
で線種,色,太さが指定できる。
さらに,gsn_csm_xyを用いているとき,
res@gsnAboveYRefLineColor = (/"transparent", "transparent", "red"/) ; YRefLineより上に出たところに色をぬる res@gsnBelowYRefLineColor = (/"blue", "transparent", "transparent"/) ; YRefLineより下に出たところに色をぬる
が使える。
また,Y軸を描くこともできる。
res@gsnXRefLine = 0 ; 指定したXの値のところに横線を引く(0にすればY軸が引かれる)。
res@xyMarkLineModesの設定を変える。
res@xyMarkLineModes = "Markers" ; 点 res@xyMarkLineModes = "MarkLines" ; 点と線
res@xyLineColars = "色の名前" ; 線の色 res@xyMarkerColors = "色の名前" ; 点の色
色の名前については以下を参照
https://www.ncl.ucar.edu/Document/Graphics/named_colors.shtml
res@xyMarkerSizes = 0.02 ; 点の大きさ res@xyMarker = 16 ; 点の種類(点種ごとに割り当てられた整数で指定)
点種については以下を参照
http://www.ncl.ucar.edu/Document/Graphics/marker_styles.shtml
res@tiXAxisString = "Year" ; 横軸 res@tiYAxisString = "Temperature" ; 縦軸
tiXAxis~で横軸,tiYAxis~で縦軸のラベルの設定がいろいろできる。フォントやフォントサイズ,傾き,場所などが自在に変更できる。タイトルや軸に少し詳細な説明がある。
res@trXReverse = True ; 横軸 res@trYReverse = True ; 縦軸
res@pmLegendDisplayMode = "Always" でとりあえず出るが,とても使えるもんじゃないらしい。
res@pmLegendSide = "Bottom" ; 凡例の基準位置。"Bottom"がデフォルト res@lgJustification = "BottomCenter" ; 凡例のどこを基準位置に合わせるか ; "Top","Center","Bottom"と"Left","Center","Right"の組合せで指定 ; "BottomCenter"がデフォルト res@pmLegendOrthogonalPosF = 0.03 ; pmLegendSideに対して直交する向きの位置 ; viewportの中央から離れる向きが正 ; すなわち res@pmLegendSide = "Bottom" (デフォルト)のとき,タテ方向の位置を指定し,下向きが正となる。 res@pmLegendParallelPosF = 1.0 ; pmLegendSideに対して平行する向きの位置 ; NDCが増加する向きが正 ; すなわち res@pmLegendSide = "Bottom" (デフォルト)のとき,ヨコ方向の位置を指定し,右向きが正となる。 res@pmLegendWidthF = 0.18 ; 幅 res@pmLegendHeightF = 0.2 ; 高さ res@xyExplicitLegendLabels = (配列) ; 凡例のラベル
他にも関数gsn_create_legendで作ってgsn_add_annotationでplotすることも可能。xy2プロットなどxyプロットではない方法の場合はこちらでやる他ない。もしくは図形や文字を直接描くことで対応する。
緯度・経度の情報がついているデータは,gsn_~_map_~のような関数を使って地図上にプロットすることができる。
※lat,lonに関して
lat,lonは以下の四つの内どれかが@unitsに設定されていないとだめ。 lat : degrees_north, degree_north, degrees north, degrees_N lon : degrees_east, degree_east, degrees east, degrees_E (lat@units = "degrees_N"などと設定できるが,おそらく普通のnetCDFのデータならついているはず) latは -90 から 90 の範囲で指定する。lonは -180 から 180 でも 0 から 360 でもいいが,gsnAddCyclicがTrueである必要がある(全球データなら自動でTrueになっているはず)。自分で全球の格子情報を設定することがあれば,0 <= lon < 360 のようにして,同じ座標を表す点を入れないこと。 0 <= lon <=360 だと0と360で同じ箇所に二つの値が取られることになり,全球データとみなしてくれない。
投影法はいくつか用意されているが,基本的にはmpProjectionで指定することができる。しかし,正距円筒図法(LAT-LONの格子),極投影図法については,もっと単純なやり方でできる。
正距円筒図法はNCLで最も一般的な図法であり,gsn_~_map_ceという関数を用いることができる。例えば,gsn_csm_contour_map_ce は以下のように用いる。
plot = gsn_csm_contour_map_ce(wks, data, res)
〔入力変数〕
wks
Workstation。gsn_open_wksで設定したもの。
data
2次元配列(y,x)
res
Resources
〔出力変数〕
plot
graphic属性の値が返される
極中心の場合には,gsn_~_map_polarという関数を用いることができる。例えば,正距円筒図法のgsn_csm_contour_map_ceに対応するものとして,gsn_csm_contour_map_polarがある。
plot = gsn_csm_contour_map_polar(wks, data, res)
res@gsnPolar = "NH" で北極中心,
res@gsnPolar = "SH" で南極中心の図が描ける。
また,例えば res@mpCenterLonF = 90 とすると,"NH"のときは時計で言う6時の方向が90°Eになり,"SH"のときは12時の方向が90°Eになる。
res@mpProjection = "図法" で設定する。
図法には,正距円筒図法("CylindricalEquidistant",デフォルト),正積円筒図法("CylindricalEqualArea"),メルカトル図法("Mercator"),正距方位図法("AzimuthalEquidistant"),正射方位図法("Orthographic"),平射方位図法("Stereographic"),ランベルト正積方位図法("LambertEqualArea"),ランベルト等角円錐図法("LambertConformal"),衛星投影("Satellite")などがある。
res@mpMinLatF = -60 ; 緯度の最小値 res@mpMaxLatF = 60 ; 緯度の最大値 res@mpMinLonF = 120 ; 経度の最小値 res@mpMaxLonF = 300 ; 経度の最大値
緯度経度の中心値で与えることもできる
res@mpCenterLatF = 30 ; 緯度の中心 res@mpCenterLonF = 180 ; 経度の中心
ランベルト円錐図法の場合は次を使う
res@mpLambertMeridianF = 135
極投影図においては,
res@gsnPolar = "NH" ; 北極中心 res@gsnPolar = "SH" ; 南極中心 res@mpCenterLonF = 90 ; "NH"のとき6時の方向が90°E,"SH"のとき12時の方向が90°E
res@mpFillOn = True ; 地図を塗りつぶす res@mpGeophysicalLineColor = "Green" ; 地図の線の色 res@mpGeophysicalLineThicknessF = 2 ; 地図の線の太さ res@mpGeophysicalLineDashPattern = 0 ; 地図の線の線種
地図と等値線やシェードなどをどういう順番で描くかを設定する
res@cnFillDrawOrder = "PreDraw"
にすると,シェードが下になって陸地が上に来る。つまり、海だけが塗りつぶされる。
res@cnFillDrawOrder = "PostDraw"
にすると,陸地の上にシェードを書くことになって陸地が隠れる。
同様に,等値線についてはres@cnLineDrawOrderで,ベクトルについてはres@vcVectorDrawOrderで変更できる。
res@mpGridAndLimbOn = True ; 格子を入れる res@mpGridLatSpacingF = 15 ; 緯度方向の間隔 res@mpGridLonSpacingF = 15 ; 経度方向の間隔 res@mpGridLineColor = "Red" ; 格子の線の色 res@mpGridLineThicknessF = 1.5 ; 格子の線の太さ res@mpGridLineDashPattern = 1 ; 格子の線の線種
地図の海岸線の解像度は,res@mpDataBaseVersionで変更することができる。デフォルトでは,
res@mpDataBaseVersion = "LowRes" ; 低解像度,V6.4.0より前のデフォルト res@mpDataBaseVersion = "MediumRes" ; 中解像度
が選択可能。バージョン6.4.0以降では,何も指定しなければ適切だと思われる方が自動選択される。
res@mpDataBaseVersion = "HighRes" ; 高解像度
を利用したい場合,https://www.io-warnemuende.de/rangs-en.htmlより,海岸線データ(rangs(?).zip および gshhs(?).zip)を全てダウンロード・解凍し,$NCARG_ROOT/lib/ncarg/database/rangs あるいは $NCARG_RANGS の下にファイルを置く。なお,NCLはShapefile比較的簡単に扱うことができるので(ncl_filedumpでも.shpファイルを読むことができる),各自でShapefileを作成・入手できれば,海岸線や河川など多様な地図を描画可能だ。
等値線やシェードのプロットは,gsn_~_contour_~のような関数を使ってプロットすることができる。地図上にプロットしたい場合は,上でも述べたgsn_~_contour_map~のような関数を用いる。
res@cnLinesOn = True
のとき等値線が引かれる(デフォルトでTrueになっている)。
等値線の設定の仕方にはいくつかある。デフォルトでは
res@cnLevelSelectionMode = "AutomaticLevels"
になっており,自動で描かれる。
等値線の最小値,最大値,間隔を手動で設定したい場合には,
res@cnLevelSelectionMode = "ManualLevels"
とする。このとき,
res@cnMinLevelValF = -10 ; 等値線の最小値 res@cnMaxLevelValF = 40 ; 等値線の最大値 res@cnLevelSpacingF = 2 ; 等値線の間隔
不均一な間隔で設定したい場合には,
res@cnLevelSelectionMode = "ExplicitLevels"
とし,
res@cnLevels = (/1.,2.,4.,8.,16./) ; 配列で等値線レベルを指定
とできる
res@cnLineDashPatern = 1 ; 等値線の線種 res@cnLineThicknessF = 2 ; 等値線の太さ res@cnLineColor = "red" ; 等値線の色
res@gsnContourNegLineDashPattern = 1 ; 負の等値線の線種 res@gsnContourPosLineDashPattern = 0 ; 正の等値線の線種 res@gsnContourZeroLineThicknessF = 0 ; ゼロの等値線の太さ(0にすると描かれない)
res@cnLineLabelsOn = False
とすると等値線のラベルが消える。Trueのとき,ラベルに関してもいろいろ設定ができる。例えば,
res@cnLineLabelInterval = 5 ; 等値線のラベルをつける間隔(この場合5本ごと) res@cnLineLabelFontHeightF = 0.01 ; ラベルの文字の大きさを変える res@cnLineLabelDensityF = 2.0 ; 同一等値線上のラベルの数を変える
res@cnInfoLabelOn = False
とすると左下の等値線の情報が消える。Trueのとき,等値線情報に関してもいろいろ設定ができる。例えば,
res@cnInfoLabelSide = "Bottom" ; スケールの基準位置 ; "Top","Bottom"(デフォルト),"Left","Right"のいずれかで指定 res@cnInfoLabelJust = "TopRight" ; スケールのどこを基準位置に合わせるか ; "Top","Center","Bottom"と"Left","Center","Right"の組合せで指定 ; "TopRight"がデフォルト res@cnInfoLabelOrthogonalPosF = 0.03 ; cnInfoLabelSideに対して直交する向きの位置 ; viewportの中央から離れる向きが正 ; すなわち res@cnInfoLabelSide = "Bottom" (デフォルト)のとき,タテ方向の位置を指定し,下向きが正となる。 res@cnInfoLabelParallelPosF = 1.0 ; cnInfoLabelSideに対して平行する向きの位置 ; NDCが増加する向きが正 ; すなわち res@cnInfoLabelSide = "Bottom" (デフォルト)のとき,ヨコ方向の位置を指定し,右向きが正となる。 res@cnInfoLabelPerimOn = False ; 枠を消す res@cnInfoLabelFontHeightF = 0.015 ; 文字の大きさを変える
また,等値線情報に書かれる内容は,cnInfoLabelString=(文字列) として変えられる。このとき,例えば$CIU$が等値線間隔,$CMN$が最小の値,$CMX$が最大の値を示す。デフォルトは,
res@cnInfoLabelString = "CONTOUR FROM $CMN$ TO $CMX$ BY $CIU$"
である。
等値線やシェードのプロットは,gsn_~_contour_~のような関数を使ってプロットすることができる。地図上にプロットしたい場合は,上でも述べたgsn_~_contour_map~のような関数を用いる。
res@cnFillOn = True
のときシェードで描かれる(デフォルトでFalseになっている)。
塗りつぶしのパターンは
res@cnFillPatern = 4 ; パターン(パターンごとに割り当てられた整数で指定)
で変更できる。パターンの種類は以下を参照
http://www.ncl.ucar.edu/Document/Graphics/fill_patterns.shtml
デフォルトではSolidFill(ベタぬり)になっている。
デフォルトでは滑らかに引かれた等値線の間を塗りつぶすようにシェードが描かれるが,GrADSでいうところのset gxout grfillに対応する塗り方(グリッドごとに塗りつぶすこと)ももちろんできる。
デフォルトでは
res@cnFillMode = "AreaFill"
となっているところを,
res@cnFillMode = "CellFill"
に変更する。
カラーマップはWorkstationに対して指定することもできるし,Plot Resourceを通して指定することもできる。
Workstationに対して指定する場合,以下の関数(procedure)を用いる。
gsn_define_colormap(wks, color_map)
wks
Workstation
color_map
使いたいカラーマップ。名前がついている色からなる文字列の配列で与えるか,RGB値またはRGBA値の配列で与えるか,デフォルトのカラーマップの名前を文字列で与えるか。
デフォルトのカラーマップは http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml
を参照すること。
なお,これらのRGB値は$NCARG_ROOT/lib/ncarg/colormaps内の各ファイルに入っている。それを参考に自分で新しいカラーマップを作ることもできる。
Resourcesを通して指定する場合,
res@cnFillPalette = "ncl_default" ; シェードのカラーマップ res@cnLinePalette = "ncl_default" ; 等値線に対しても指定できる
のように指定する。色の名前の1次元配列かRGB値またはRGBA値の2次元配列(色数×3or4)でも指定できる。
その場で色の配列で指定する場合,
res@cnFillColors = "色の配列"
を使うこともできるが,cnLevelsで指定した配列の大きさと整合するように。
カラーマップを設定すると,色とインデックスが対応する。10色のカラーマップを指定した場合,0が白,1が黒,2~11がカラーマップ内の色となる。
カラーマップをRGB値の配列として取得するためには,
color_map = read_colormap_file(filename)
〔入力変数〕
filename
カラーマップの入ったファイルを"ncl_default"のように文字列で与える。
〔出力変数〕
color_map
RGB値が入った色数×3の配列
を用いる。これをres@cnFillPaletteに入れることができる。
上のように,read_colormap_fileでRGB値の配列を得ることができる。したがって,この出力変数color_map(色数をNとする)を使って,
N = dimsizes(colormap(:,0)) res@cnFillPalette = color_map(0:N/2,:) ; カラーマップの前半のみ res@cnFillPalette = color_map(::2,:) ; 1つおき res@cnFillPalette = color_map(::-1,:) ; 反転
のようにできる。
もしくは,
res@gsnSpreadColors = True
とし,
res@gsnSpreadColorStart = 10 ; カラーインデックスで指定 res@gsnSpreadColorEnd = -10 ; 負にすると最後の色からの位置で指定できる
ともできる。gsnSpreadColorStartのデフォルトは2(前述のように0, 1は白と黒だから),gsnSpreadColorEndのデフォルトは-1(最後から1番目)である。gsnSpreadColorStartがgsnSpreadColorEndよりも後にある場合には,カラーマップが反転する。
res@lbLabelBarOn = False
でカラーバーが消える。
res@lbLabelBarOn = True
として,さらに以下のようにいろいろ設定することもできる。
res@lbOrientation = "Vertical" ; タテ置き res@lbOrientation = "Horizontal" ; ヨコ置き res@lbLabelFontHeightF = 0.02 ; ラベルの文字の大きさ res@pmLabelBarSide = "Bottom" ; バーの基準位置。"Bottom"がデフォルト res@lbJustification = "CenterCenter" ; バーのどこを基準位置に合わせるか ; "Top","Center","Bottom"と"Left","Center","Right"の組合せで指定 ; "CenterCenter"がデフォルト res@pmLabelBarOrthogonalPosF = 0.02 ; pmLabelBarSideに対して直交する向きの位置 ; viewportの中央から離れる向きが正 ; すなわち res@pmLabelBarSide = "Bottom" (デフォルト)のとき,タテ方向の位置を指定し,下向きが正となる。 res@pmLabelBarParallelPosF = 0.5 ; pmLabelBarSideに対して平行する向きの位置 ; NDCが増加する向きが正 ; すなわち res@pmLabelBarSide = "Bottom" (デフォルト)のとき,ヨコ方向の位置を指定し,右向きが正となる。 res@pmLabelBarWidthF = 0.6 ; バーの幅 res@pmLabelBarHeightF = 0.15 ; バーの高さ
Version6.4.0以降では,両端の形を三角形にできるらしい。
res@lbBoxEndCapStyle = "RectangleEnds" ; いつもの四角形 res@lbBoxEndCapStyle = "TriangleLowEnd" ; 低い方が三角形 res@lbBoxEndCapStyle = "TriangleHighEnd" ; 高い方が三角形 res@lbBoxEndCapStyle = "TriangleBothEnds" ; どっちも三角形
res@lbTitleOn = True
とし,
res@lbTitleString = "Title" ; もちろん文字列の変数でも良い res@lbTitlePosition = "Right" ; タイトルのカラーバーに対する位置 res@lbTitleDirection = "Across" ; タイトルの文字がヨコ方向 res@lbTitleDirection = "Down" ; タイトルの文字がタテ方向 res@lbTitleFontHeightF = 0.025 ; タイトルの文字の大きさ
でいろいろできる。
ベクトルのプロットは,gsn_~_vector_~のような関数を使ってプロットすることができる。地図上にプロットしたい場合は,上でも述べたgsn_~_vector_map~のような関数を用いる。
plot = gsn_csm_vector_map_ce(wks, data1, data2, res)
〔入力変数〕
wks
Workstation。gsn_open_wksで設定したもの。
data1, data2
2次元配列(y,x)。それぞれベクトルのx(lon),y(lat)成分。そのまま描くとベクトルの密度が濃すぎるのであれば,data1(::4,::4), data2(::4,::4)のように間引きすればよい。
res
Resources
〔出力変数〕
plot
graphic属性の値が返される
NCLには4種類のベクトルが存在する。それぞれ以下のように設定する。
res@vcGlyphStyle = "LineArrow" ; 矢印型の線でできたもの res@vcGlyphStyle = "FillArrow" ; 矢印型の図形でできたもの res@vcGlyphStyle = "WindBarb" ; 風矢羽根 res@vcGlyphStyle = "CurlyVector" ; 曲がった矢印
デフォルトでは"LineArrow"となっている。個人的には"FillArrow"で細かく設定するのが好き。"LineArrow"から"FillArrow"への変更は,
res@vcFillArrowsOn = True
でも可能。
NCLではデフォルトでベクトルの真ん中がそのデータの座標に対応しているが,これも変更可能である。
res@vcPositionMode = "ArrowHead" ; ベクトルのあたま res@vcPositionMode = "ArrowCenter" ; ベクトルの真ん中 res@vcPositionMode = "ArrowTail" ; ベクトルのしっぽ
例えば風速[m/s]を描くとき,
res@vcRefMagnitudeF = 1.0
で1m/sが基準となるベクトルとなる。この基準となるベクトルの長さを決めるには,
res@vcRefLengthF = 0.01 ; 数字はWork Stationの横の長さ対して何割かを示す
とする(0から1の間で指定する)。
ベクトルの長さと値の対応は,等値線と同じようなやり方でもできる。
res@vcLevelSelectionMode = "ManualLevels" res@vcMaxLevelValF = 10 res@vcMinLevelValF = 1 res@vcLevelSpacingF = 2
res@vcRefAnnoOn = False
でベクトルのスケールが消える。
res@vcRefAnnoOn = True
として,さらに以下のようにいろいろ設定できる。
res@vcRefAnnoArrowAngleF = 0.0 ; スケールベクトルの角度。デフォルトは0度(右向き)。 res@vcRefAnnoSide = "Bottom" ; スケールの基準位置。"Bottom"がデフォルト res@vcRefAnnoJust = "TopRight" ; スケールのどこを基準位置に合わせるか ; "Top","Center","Bottom"と"Left","Center","Right"の組合せで指定 ; "TopRight"がデフォルト res@vcRefAnnoOrthogonalPosF = 0.03 ; vcRefAnnoSideに対して直交する向きの位置 ; viewportの中央から離れる向きが正 ; すなわち res@vcRefAnnoSide = "Bottom" (デフォルト)のとき,タテ方向の位置を指定し,下向きが正となる。 res@vcRefAnnoParallelPosF = 1.0 ; vcRefAnnoSideに対して平行する向きの位置 ; NDCが増加する向きが正 ; すなわち res@vcRefAnnoSide = "Bottom" (デフォルト)のとき,ヨコ方向の位置を指定し,右向きが正となる。 res@vcRefAnnoBackgroundColor = "red" ; 背景色
Annotation中の文字列に関しては,
res@vcRefAnnoFontHeightF = 0.02 ; フォントの大きさ res@vcRefAnnoString1On = True ; スケールベクトルの上部の文字列を有効にする res@vcRefAnnoString1 = "$RFM$"+u@units ; デフォルトは"$VMG$" res@vcRefAnnoString2On = True ; スケールベクトルの下部の文字列を有効にする res@vcRefAnnoString2 = "wind" ; デフォルトは"Reference Vector"
で設定する。なお,$VMG$はAnnotationのベクトルが表す長さ,$RFM$はプロットする際の基準長(RefMagnutude)の値を表す。このほかには,最小の長さを示す$MNM$,最大の長さを示す$MXM$などがある。
また,枠線の設定は,
res@vcRefAnnoPerimOn = True res@vcRefAnnoPerimThicknessF = 2 res@vcRefAnnoPerimColor = "blue"
等で可能。
変数の配列を間引いてもよいが,
res@vcMinDistanceF = 0.001
としてもベクトル同士の間隔を変えることができる。極投影図などの場合,経度方向に等間隔だと極付近でベクトルが密になりすぎてしまうが,これを設定しておけば適切に間引かれる。
ベクトルのデザインに関する細かい設定に用いるResourcesを紹介する。NCLでは基本的に,ベクトルの頭の長さや幅がベクトル自体の長さでスケーリングされることに注意しよう。
LineArrowのデザインの設定は以下で可能である。
res@vcLineArrowColor = "purple" ;; 色 res@vcLineArrowThicknessF = 5 ;; 太さ res@vcLineArrowHeadMinSizeF = 0.005 ;; 矢印の頭を形成する線の最小長をビューポート幅に対する比で表したもの。 ; 短いベクトルでも頭が小さくなり過ぎないようにするための値。 res@vcLineArrowHeadMaxSizeF = 0.05 ;; 矢印の頭を形成する線の最大長をビューポート幅に対する比で表したもの。 ; 長いベクトルでも頭が大きくなり過ぎないようにするための値。
しかし,デザインを気にするならFillArrowを用いるのが良いだろう。
res@vcFillArrowFillColor = "pink" ;; 矢印の色 res@vcFillArrowWidthF = 0.1 ;; 矢印の太さ res@vcFillArrowHeadXF = 0.5 ;; 頭の長さ(外側)。ベクトルの長さに対する比で,0~2の範囲で与える。 ; この比はベクトルの長さに対して不変である。 res@vcFillArrowHeadYF = 0.25 ;; 頭の幅。ベクトルの長さに対する比で,0~1の範囲で与える。 ; 頭の長さに比例して調節される。 ; vcFillArrowHeadMinFracYFとvcFillArrowMinFracWidthFの両方が0であるとき, ; 頭の幅の長さに対する比は,ベクトルの長さに対して不変である。 ; 細かいことだが,矢印の軸部分の幅は含まれない。 res@vcFillArrowHeadInteriorXF = 0.25 ;; 頭の長さ(内側)。ベクトルの長さに対する比で,0~1の範囲で与える。 ; 頭の長さに比例して調節される。 res@vcFillArrowEdgeColor = "purple" ;; 枠線の色 res@vcFillArrowEdgeThicknessF = 10 ;; 枠線の太さ res@vcFillArrowMinFracWidthF = 1. ;; 最小の長さで描かれた矢印の幅のvcFillArrowWidthFに対する比。 ; 0~1の範囲で与え,1のとき,長さに関わらず同じ幅で描かれる。 res@vcFillArrowHeadMinFracXF = 0.2 ;; 最小の長さで描かれた矢印の頭の長さのvcFillArrowHeadXFに対する比。 ; 0~1の範囲で与え,1のとき,長さに関わらず同じ頭の長さで描かれる。 res@vcFillArrowHeadMinFracYF = 0.2 ;; 最小の長さで描かれた矢印の頭の幅のvcFillArrowHeadXFに対する比。 ; 0~1の範囲で与え,1のとき,長さに関わらず同じ頭の幅で描かれる。
下の図も参考にしてほしい。
ベクトルの色を大きさによって変えたい場合,
res@vcMonoLineArrowColor = False
あるいは
res@vcMonoFillArrowFillColor = False
によって単色での描画を解除し,
res@vcLevelPalette = "default" ; カラーマップの名前やRGB/RGBA値の配列
でカラーマップを指定することが一つの方法である。
図のタイトルや軸は主にti(Title)Resourcesとtm(Tickmark)Resourcesを用いて設定を行う。
res@tiMainString = "This is the TITLE"
基準位置は,
res@tiMainPosition = "Left" ; Viewportの左端 res@tiMainPosition = "Center" ; Viewportの中央 (デフォルト) res@tiMainPosition = "Right" ; Viewportの右端
および,
res@tiMainSide = "Top" ; Viewportの上端 (デフォルト) res@tiMainSide = "Bottom" ; Viewportの下端
で設定する。基準位置からの微調整は,
res@tiMainOffsetXF = 0.05 ; x軸方向 res@tiMainOffsetYF = -0.05 ; y軸方向
によってNDC座標で設定する。
タイトルのどの部分を基準位置とするかについては,
res@tiMainJust = "TopLeft" ; 左上 res@tiMainJust = "TopCenter" ; 真ん中上 res@tiMainJust = "TopRight" ; 右上 res@tiMainJust = "CenterLeft" ; 左真ん中 res@tiMainJust = "CenterCenter" ; ど真ん中 (デフォルト) res@tiMainJust = "CenterRight" ; 右真ん中 res@tiMainJust = "BottomLeft" ; 左下 res@tiMainJust = "BottomCenter" ; 真ん中下 res@tiMainJust = "BottomRight" ; 右下
で設定する。
res@tiMainFontHeightF = 0.03 ; タイトルの文字の大きさ res@tiMainFontThicknessF = 3. ; タイトルの文字の太さ res@tiMainFontColor = 1 ; タイトルの色
res@tiMainDirection = "Down" ; タテ向き res@tiMainDirection = "Across" ; ヨコ向き (デフォルト)
タイトルとは別に図の左上や右上に文字列を書くことができる。
res@gsnLeftString = "LeftString" ; デフォルトは描画した変数の@long_name res@gsnRightString = "RightString" ; デフォルトは描画した変数の@units
res@gsnLeftStringFontHeightF = 0.025 res@gsnRightStringFontHeightF = 0.025 res@gsnLeftStringFontColor = "blue" res@gsnRightStringFontColor = "blue"
res@gsnLeftStringOrthogonalPosF = 0.02 res@gsnRightStringOrthogonalPosF = 0.02 res@gsnLeftStringParallelPosF = 0.2 res@gsnRightStringParallelPosF = 0.8
res@tmXBBorderOn = True ; ヨコ軸下側の軸を描く res@tmXTBorderOn = True ; ヨコ軸上側の軸を描く res@tmYLBorderOn = True ; タテ軸左側の軸を描く res@tmYRBorderOn = True ; タテ軸右側の軸を描く
res@tmBorderLineColor = "black" ; 枠線の色 res@tmBorderThicknessF = 2 ; 枠線の太さ(デフォルトは2)
軸ラベルやティック(棒)を描画するかしないかの設定。ラベルは主目盛のティックにつく。
res@tmXBOn = True ; ヨコ軸下側のティック(主目盛)を描く res@tmXTOn = False ; ヨコ軸上側のティック(主目盛)を描かない res@tmYLOn = True ; タテ軸左側のティック(主目盛)を描く res@tmYROn = False ; タテ軸右側のティック(主目盛)を描かない res@tmXBMinorOn = False ; ヨコ軸下側のティック(補助目盛)を描かない res@tmXTMinorOn = False ; ヨコ軸上側のティック(補助目盛)を描かない res@tmYLMinorOn = True ; タテ軸左側のティック(補助目盛)を描く res@tmYRMinorOn = False ; タテ軸右側のティック(補助目盛)を描かない res@tmXBLabelsOn = True ; ヨコ軸下側のラベルを描く res@tmXTLabelsOn = False ; ヨコ軸上側のラベルを描かない res@tmYLLabelsOn = True ; タテ軸左側のラベルを描く res@tmYRLabelsOn = False ; タテ軸右側のラベルを描かない
ティックやラベルの間隔などの設定の仕方は,
res@tmXBMode = "Manual" ; ヨコ軸下側のティックの設定の仕方 res@tmXTMode = "Manual" ; ヨコ軸上側のティックの設定の仕方 res@tmYLMode = "Manual" ; タテ軸左側のティックの設定の仕方 res@tmYRMode = "Manual" ; タテ軸右側のティックの設定の仕方 ; "Automatic"(デフォルト),"Manual","Explicit"から選択
で指定することができる。"Manual"の場合,例えばヨコ軸下側(XB)であれば,次のように設定可能。
res@tmXBTickStartF = 10 ; 最初のティックの値 res@tmXBTickEndF = 50 ; 最後のティックの値 res@tmXBTickSpacingF = 5 ; ティック(主目盛)の間隔 res@tmXBMinorPerMajor = 4 ; 主目盛の間に入る補助目盛の本数 ; この場合,10から50まで5間隔で主目盛が,1間隔で補助目盛が描かれる
一方,"Explicit"の場合,例えばヨコ軸下側(XB)であれば,次のように設定可能。
res@tmXBValues = (/10,20,40,80/) ; 主目盛のティックをつける値 res@tmXBMinorValues = (/15,25,30,35,50,60,70/) ; 補助目盛のティックをつける値 res@tmXBLabels = (/"10N","20N","40N","80N"/) ; ラベル。res@tmXBValuesと同じ要素数。
なお,正距円筒図法の地図の場合,主目盛の間隔は,
res@gsnMajorLatSpacing = 30 res@gsnMajorLonSpacing = 60
補助目盛の間隔は,
res@gsnMinorLatSpacing = 5 res@gsnMinorLonSpacing = 10
にて設定可能。
ヨコ軸下側(XB)のティックの大きさや色などを設定する場合,
res@tmXBMajorThicknessF = 2 ; ティック(主目盛)の太さ。デフォルトは2。 res@tmXBMajorLineColor = "black" ; ティック(主目盛)の色 res@tmXBMajorLengthF = 0.01 ; ティック(主目盛)の長さ。NDC座標で与える。 ; デフォルトはviewportの高さ0.6に対して0.02。 res@tmXBMajorOutwardLengthF = 0.01 ; ティック(主目盛)が軸を横切ってのびる部分の長さ。NDC座標で与える。 ; デフォルトは0で,軸に接して横切らない。 res@tmXBMinorThicknessF = 1 ; ティック(補助目盛)の太さ。デフォルトは1。 res@tmXBMinorLineColor = "black" ; ティック(補助目盛)の色 res@tmXBMinorLengthF = 0.008 ; ティック(補助目盛)の長さ。NDC座標で与える。 ; デフォルトはviewportの高さ0.6に対して0.01 res@tmXBMinorOutwardLengthF = 0.008 ; ティック(補助目盛)が軸を横切ってのびる部分の長さ。NDC座標で与える。 ; デフォルトは0で,軸に接して横切らない。
ヨコ軸下側(XB)のラベルの文字の大きさや色などを設定する場合,
res@tmXBLabelFontHeightF = 0.018 ; ラベルの文字の大きさ(デフォルトはviewportの高さ0.6に対して0.02) res@tmXBLabelFontColor = "black" ; ラベルの文字の色 res@tmXBLabelAngleF = 45 ; ラベルの文字の回転角(デフォルトは0で回転なし) res@tmXBPrecision = 3 ; ラベルの数値の桁数
グリッド線を引く場合は,以下のようにする。
res@tmXMajorGrid = True ; ヨコ軸の主目盛にあわせてグリッド線を引く res@tmXMinorGrid = True ; ヨコ軸の補助目盛にあわせてグリッド線を引く res@tmYMajorGrid = True ; タテ軸の主目盛にあわせてグリッド線を引く res@tmYMinorGrid = True ; タテ軸の補助目盛にあわせてグリッド線を引く
太さや色の設定は,例えばヨコ軸主目盛(XMajor)の場合,
res@tmXMajorGridThicknessF = 2 ; 太さ res@tmXMajorGridLineColor = "black" ; 色 res@tmXMajorGridLineDashPattern = 0 ; 線種
とする。グリッドとxyプロットなどとの前後関係を変更するには,
res@tmGridDrawOrder = "PreDraw" ; v6.5.0以降で使用可能 ; "PreDraw","Draw","PostDraw"(デフォルト) から選択
を用いる。
複数枚の図を一度にplotする方法にはいくつかあるが,最も基本的なものは,gsn_panelというprocedureを用いる方法である。
この方法では,まず1枚1枚の絵を作り,それらを配列にまとめてgsn_panelに渡す。ただし,この手法は並べる絵のサイズが異なる場合にはうまくいかないので注意。
1枚1枚の絵を作る段階では図を作るのみで描くことはしない。したがって,gsn_csm_~などで絵を作る際に,
res@gsnDraw = False ; gsnの関数が呼ばれた際に絵を描かない res@gsnFrame = False ; gsnの関数が呼ばれた際にWorkStationの更新を行わない
としておくのを忘れないように。
gsn_panel(wks, plot, dim, resP)
〔入力変数〕
wks
Workstation。gsn_open_wksで設定したもの。
plot[*]
gsn関数などで作られたgraphic属性の1次元配列
dim[*]
パネルプロットの並べ方。2通りの指定の仕方がある。デフォルトでは行数と列数で指定する。例えば,plotが6枚の絵から構成されている(すなわち長さ6の1次元配列である)とすると,縦3枚×横2枚で並べたければ dim = (/3, 2/) とする。一方で,各行あたりの枚数で指定することもできる。この形式で指定するときには,resP@gsnPanelRowSpec=True とする必要がある。6枚の絵から構成されているplotを,1行目に1枚,2行目に3枚,3行目に2枚というように並べたい場合には, dim = (/1, 3, 2/) とする。
resP
パネルプロットに関するResources(絵そのもののResourcesではない)
なお,plotを作る際にres@gsnDrawやres@gsnFrameをFalseとしていたとしても,後で改めてdrawやframeを実行する必要はない。gsn_panelを実行するだけで絵が描かれる。
デフォルトでは,行と列の数で指定する。
resP@gsnPanelRowSpec = False ; 行数×列数で指定する gsn_panel(wks, plot, (/3,2/), resP) ; 縦3枚,横2枚のパネルプロット
各行の枚数で指定することも可能で,
resP@gsnPanelRowSpec = True ; 各行の枚数で指定する gsn_panel(wks, plot, (/1,3,2/), resP) ; 3行のパネルプロット,1行目が1枚,2行目が3枚,3行目が2枚
のようにする。この場合,デフォルトでは各行で図はセンタリングされて配置される。
resP@gsnPanelCenter = False
とすると,各行で図は左詰めで配置される。
6.3.0以前のバージョンでは,図中に文字を挿入するTextItem Resources(tx...)を用いる。
resP@txString = "Title"
で指定する。フォントサイズ等の変更は,
resP@txFontHeightF = 0.04 ; フォントサイズ resP@txPosXF = 0.5 ; X方向の位置,NDCで指定(左下が(0,0),右上が(1,1)) resP@txPosYF = 0.8 ; Y方向の位置,NDCで指定
で可能。
6.4.0以降のバージョンでは,パネルプロットのタイトル用に用意されているGSN Resources(gsnPanelMain...)を用いる。
resP@gsnPanelMainString = "Title"
で指定する。フォントサイズ等の変更は,
resP@gsnPanelMainFontHeightF = 0.04 ; フォントサイズ resP@gsnPanelMainPosXF = 0.5 ; X方向の位置,NDCで指定(左下が(0,0),右上が(1,1)) resP@gsnPanelMainPosYF = 0.8 ; Y方向の位置,NDCで指定
で可能。
個々のplotをつくる際に,
res@lbLabelBarOn = False
としておき,gsn_panelを実行する際に,
resP@gsnPanelLabelBar = True
とすると,パネル全体で一つのカラーバーをつけることができる。
細かい設定に関しては,個々の図で用いるカラーバーの設定に関するResourcesと同じものを使うことができる。
resP@gsnPanelXWhiteSpacePercent = 5. ; 図同士のヨコ方向の間隔をあける(図の幅の5%) resP@gsnPanelYWhiteSpacePercent = 8. ; 図同士のタテ方向の間隔をあける(図の高さの8%)
パネルプロットの外に文字を入れたい場合,カラーバーがはみ出してしまう場合,描画範囲の中の一部だけをgsn_panelを使ったパネルプロットにしたい場合, 同じ紙面上で複数のパネルプロットを組み合わせたい場合など,パネルプロットが描かれる範囲を制限したい場合には以下のResourcesを用いる。
resP@gsnPanelBottom = 0.05 ; 0~1で設定。この場合,パネルプロットの下から0.05(ページ全体の5%)までが余白となる resP@gsnPanelLeft = 0.5 ; 左側を半分空ける resP@gsnPanelRight = 0.5 ; 右側を半分空ける resP@gsnPanelTop = 0.9 ; 上側10%を空ける
resP@gsnPanelFigureStrings = (/"a","b","c","d","e","f"/)
とすると各図にaからfまでの記号がつく。細かい設定は,
resP@gsnPanelFigureStringsFontHeightF = 0.04 ; 文字の大きさ resP@gsnPanelFigureStringsPerimOn = True ; 枠線のありなし resP@gsnPanelFigureStringsBackgroundFillColor = "red" ; 文字の背景の色
で可能。文字の位置は,6.4.0以降のバージョンでは,専用のGSN Resourceである
resP@gsnPanelFigureStringsJust = "TopLeft" ; 左上
を使う。6.3.0以前のバージョンでは,Annotation Manager Resourceである
resP@amJust = "TopLeft" ; 左上
で変更可能。
複数の図を縦あるいは横にくっつけて並べる場合には,関数gsn_attach_plotsが使える。この方法でも,まずは1枚1枚の図を作り,それを関数に渡してまとめて1枚の図にすることができる。したがって,この場合も1枚1枚の絵を作る際に,
res@gsnDraw = False res@gsnFrame = False
としておくのを忘れないように。
dum = gsn_attach_plots(base, plots, res_base, res_plots)
〔入力変数〕
base[1]
gsn関数などで作られたgraphic属性の変数(要素は一つ。)
plots[*]
gsn関数などで作られたgraphic属性の1次元配列
res_base, res_plots
それぞれbase, plotsに対応するres
〔出力変数〕
dum
graphic属性の変数が出力されるが,普通はこれをその後に使うことはないだろう。gsn_attach_plotsを複数回実行する場合には,それぞれ別の変数名にしておく必要がある。plotsをbaseにくっつけていくので,実際に絵を描く段階で使う変数はbaseになる。
なお,この関数はgsn_panelとは異なり,gsn_attach_plotsを実行するだけでは絵が描かれない。後で改めてdrawやframeを実行することになる。
デフォルトでは,
res_base@gsnAttachPlotsXAxis = False ; y軸をくっつけていく
となっており,絵が横に並ぶ。
res_base@gsnAttachPlotsXAxis = True ; x軸をくっつけていく
とすれば絵が縦に並ぶ。
また,デフォルトでは
res_base@gsnAttachBorderOn = True ; 境界線を描く
となっているが,
res_base@gsnAttachBorderOn = False ; 境界線を描かない
として図と図の間の境界線を消すことが可能。
図の位置やサイズを直接指定するには,以下のView port Resourcesを用いる。
res@vpXF = 0.2 ; 図の左端の座標 res@vpYF = 0.8 ; 図の上端の座標 res@vpWidthF = 0.6 ; 図の幅 res@vpHeightF = 0.3 ; 図の高さ
数値はNDC(左下が(0,0),右上が(1,1)となるような座標)で与える。
基本的にはoverlayを用いて複数の図(例えばシェードとコンターなど)を重ねる。
複数の図を重ねる場合にはprocedure overlayを用いるのが一般的である。
二つの図を重ねる
overlay(plot, plot2)
〔入力変数〕
plot
図を重ねるベースになるgraphic型変数。
plot2
plotに重ねるgraphic型変数。
plotおよびplot2を作る際には,それぞれのResourcesをres, res2として,
res@gsnDraw = False res@gsnFrame = False res2@gsnDraw = False res2@gsnFrame = False
としておくことを忘れずに。そうしなければoverlayする前に絵が描画されてしまう。overlayした後,draw(plot)を実行して絵を描き,WorkStationの変数がwksならframe(wks)でフレームの更新を行うことが一般的な使い方だろう。
また,座標変換やデータ範囲などはplotで設定されたものに従い,gsn_csm_*_map...のような関数で作られた地図ベースのプロットはplot2として与えることはできないことに注意。したがって,コンターの図にベクトルの図を重ねたいときには,例えば,gsn_csm_contour_mapでplotを作り,gsn_csm_vectorでplot2を作り,overlay(plot,plot2)を実行する。plot2を作るときにgsn_csm_vector_mapを使うとエラーを吐く。
ある値以上/以下の領域をハッチや点描で重ねて示すには,関数ShadeGtContourなどを用いる。これらの関数は,gsn_csm_contour_mapなどで作られた既存のgraphic型変数を変更する形で用いる。具体的な使い方については,スクリプト例:SSTトレンドも参照のこと。
指定した値よりも大きな領域に色やパターンでシェードをかける関数。
指定した値よりも小さな領域に色やパターンでシェードをかける関数。
指定した二つの値の間に含まれない領域に色やパターンでシェードをかける関数。
指定した二つの値の間に含まれる領域に色やパターンでシェードをかける関数。
なお,公式にはこれらの関数ではなく,こちらを使うことが推奨されているようである。
指定した値よりも大きな/小さな領域に色やパターンでシェードをかける関数。
gsn_csm_~のような関数で作成したプロットに線や図形,文字を重ねるには以下の関数を用いる。この場合,座標はプロット上の座標(例えば地図であれば緯度や経度)で指定する。
プロットに重ねて線(ポリライン)を引く関数
プロットに重ねて図形(ポリゴン)を描く関数
プロットに重ねて点(マーカー)を描く関数
プロットに重ねて文字を描く関数
また,workstation上に直接 線や図形,文字を重ねるには以下のprocedureを用いる。この場合,座標はNDC(Normalized Device Coordinates)で指定する。
workstation上に線(ポリライン)を引くprocedure
workstation上に図形(ポリゴン)を描くprocedure
workstation上に点(マーカー)を描くprocedure
workstation上に文字を描くprocedure
線や図形に関する設定はgs(graphics styles) resourcesを通して行う。
res@gsLineColor = "green" ; 線の色 res@gsLineThicknessF = 3.0 ; 線の太さ res@gsLineDashPattern = 1 ; 線種 res@gsFillColor = "purple" ; 図形の塗りつぶしの色 res@gsFillOpacity = 0.3 ; 図形の塗りつぶしの不透明度。0(完全に透明)から1(完全に不透明)までで与える。 res@gsFillIndex = 2 ; 図形の塗りつぶしのパターン。デフォルトは0(ベタ塗り) res@gsMarkerIndex = 16 ; マーカーの種類 res@gsMarkerSizeF = 0.02 ; マーカーの大きさ(デフォルトは0.007) res@gsMarkerColor = "yellow" ; マーカーの色
線や図形とプロットとの前後関係を変更するには,
res@tfPolyDrawOrder = "PreDraw" ; "PreDraw","Draw","PostDraw"(デフォルト) から選択
で行う。文字に関する設定はtx(text) resourcesを通して行う。
res@txFontHeightF = 0.016 ; 文字の大きさ res@txFontColor = "orange" ; 文字の色
文字列の位置を指定する際に,文字列のどこを基準位置とするかは以下で設定できる。
res@txJust = "TopLeft" ; 左上 res@txJust = "TopCenter" ; 真ん中上 res@txJust = "TopRight" ; 右上 res@txJust = "CenterLeft" ; 左真ん中 res@txJust = "CenterCenter" ; ど真ん中 (デフォルト) res@txJust = "CenterRight" ; 右真ん中 res@txJust = "BottomLeft" ; 左下 res@txJust = "BottomCenter" ; 真ん中下 res@txJust = "BottomRight" ; 右下
様々な図に関する設定において,一時的にNDC(Normalized Device Coordinates)を図に重ねて表示しておくと便利なことがある。NDCは左下が(0,0),右上が(1,1)となるような座標である。
NDCのグリッドを描く。
drawNDCGrid(wks)
〔入力変数〕
wks
Workstation
なお,プロット上の座標からNDCへの変換はdatatondc,NDCからプロット上の座標への変換はndctodataにより行うことができる。