memoring - PyNCL
PyNGLはNCLのグラフィック、解析コマンド、PyNIOはファイルIO関係にPythonからアクセスできる。

導入

2011.12.22 Ubuntu11.10 64bit
2012.2.15 Ubuntu11.10 32bit opendap版、ssl関係を追記、PyNgl、PyNioをバイナリで導入

NCAR command languageのインストール

PyNGL/PyNIOはNCLのPythonインターフェースなのでまずはNCLを導入しておく必要がある。こちらにしたがって導入。

PyNGL/PyNIOのインストール

Earth System GridからPyNGLとPyNIOのsource codeをダウンロードする。適当なディレクトリに解凍する。まず必要なライブラリをインストールする。
$ sudo apt-get install libssl0.9.8  #open-dap版の場合
$ sudo apt-get install netcdf-bin libnetcdf-dev  #すでに入っていれば不要
$ sudo apt-get install libx11-dev libjpeg-dev
  • バイナリ版
バイナリ版でも大丈夫でした。解凍してPythonのパスの通ったディレクトリに置きます。
  • ソースから
いつものようにsetup.pyをたたけばよし。ただし事前に環境変数の設定が必要。
$ export F2CLIBS=gfortran
$ export F2CLIBS_PREFIX=/usr/local/lib
$ sudo -E python setup.py install
  • (注1):環境変数NCARG_ROOTにNCLをインストールしたパスを通しておく。.bashrcに書いた場合はsudo -Eでルートに環境変数を引き継ぐようにする。
  • (注2):NumPyが必要。
$ sudo apt-get install libx11-dev
あとはPythonのパスを通す。
#PyNCL                                                                                           
export PYTHONPATH="${PYTHONPATH}:/usr/local/lib/python2.7/dist-packages/PyNGL"
export PYNGL_NCARG="/usr/local/lib/python2.7/dist-packages/PyNGL/ncarg"

#PyNIO                                                                                           
export PYTHONPATH="${PYTHONPATH}:/usr/local/lib/python2.7/dist-packages/PyNIO"

PyNIOのコンパイルにはいくつかライブラリが必要。
# netcdf4
export NETCDF4_PREFIX=/usr/local/netcdf-4.1.3
export HAS_NETCDF4=1

# hdf5
export HDF5_PREFIX=/usr/local/hdf5-1.8.10
export HAS_HDF5=1

#szip
export SZIP_PREFIX=/usr/local/szip-2.1
export HAS_SZIP=1
$ sudo apt-get install libcurl4-openssl-dev

基本

プロットの流れ

#インポート
import numpy, Ngl
#描画領域の作成
wks = Ngl.open_wks(wks_type,"ファイル名")
#描画領域を引数にプロット
plot = Ngl.xy(wks,x,y)

Ngl.end() #スクリプトの最後に記述

リソース

プロットや描画領域の引数として与えて、図の色や線種、軸、フォントなどを設定する。
resources = Ngl.Resources()         #リソースの作成
plot = Ngl.xy(wks,x,y,resources)
del resources                       #使わなくなったリソースの削除

ファイルの取り扱い

アスキーファイル

data = Ngl.asciiread(ファイル名,次元,型)
先頭から順に読み込んでNumPy Array型が返される。次元に-1を指定すると先頭から最後まで読み込んで1次元のNumPy Arrayを返す。
  • (例)129行4列で列ごとに変数が入っている場合
経度次元  u          v       t
1.00     38.24      1.13    221.66
2.00     36.29      1.18    221.47
3.00     34.46      1.57    221.30
data = Ngl.asciiread("filename",[516],"float")

lon  = data[0:512:4]
u    = data[1:513:4]
v    = data[2:514:4]
t    = data[3:515:4]

lon = (lon-1.) * 360./128.
t   = (t-273.15) * 9./5. + 32.
NumPy Array型の部分配列はarray[開始:終了:間隔]。Pythonのスライスだね。

NetCDFファイル

ファイルの読み込み
import Nio
cdf_file = Nio.open_file("ファイルパス","r")
変数の読み込み
NumPy Array型が返される。
temp = cdf_file.variables["T"]    # temperature
lon  = cdf_file.variables["lon"]  # longitude
あとは部分配列として扱う。
  • (例)経度、緯度ごとのデータを取り出す。
ncdumpの結果が
variables:
        …
        short hgt(time, level, lat, lon) ;
        …
なら
hgt = cdf_file.variables["hgt"]
hgta = hgt[0,0,:,:]

図として出力

wkres = リソース
wks_type = "eps"
wks = Ngl.open_wks(wks_type, "ファイル名", wkres)

描画一般

画面に表示

wks_type = "x11"
wks = Ngl.open_wks(wks_type, "")

カラーマップの指定

wkres.wkColorMap = カラーマップ名

等値線

等値線を引く

plot = Ngl.contour(描画領域,2次元配列,リソース)

地図つきの等値線を引く

plot = Ngl.contour_map(描画領域,2次元配列,リソース)

等値線を引く値を指定する

等値線の最大値、最小値、間隔を指定する

等値線を引かない範囲を指定する

等値線の色(単色)を指定する

workstationのリソースのwkColorMapで指定されたカラーマップが使われる。
resources.cnMonoLineColor = False #コンターカラーを複数色にする

負の値の等値線の線種を指定する。

ゼロ値の等値線の太さを指定する。

等値線のラベルを表示する/しない

resources.cnLineLabelsOn = True/False

等値線の情報を表示する/しない

resources.cnInfoLabelOn = True/False

シェード

シェードで描画する

直接シェードに対応するものはないので等値線の塗りつぶしを使う。
resources.cnFillOn = True             # コンターを塗りつぶす
resources.cnLinesOn = False           # コンターを表示しない
plot = Ngl.contour(描画領域,2次元配列,resources)

カラーマップを指定する

resources.pmLabelBarDisplayMode = "Always" # Turn on label bar.

塗りつぶしのパターンを指定する

resources.cnMonoFillPattern = True

折れ線グラフ

折れ線グラフを引く

x = [1, 2, 3]     #x軸の値
y = [10, 12, 15]  #y軸の値。リスト又はNumPy Array。
plot = Ngl.xy(wks, x, y)

グラフの色を指定する

resources.xyLineColor = 色番号or"色の名前"
resources.xyLineColors = 色番号or"色の名前"のリスト #異なる色で複数プロットの場合

グラフの太さを変える

resources.xyLineThicknessF = 太さ  
resources.xyLineThicknesses = 太さのリスト #異なる太さで複数プロット    

グラフのマークの有無を指定する

resources.xyMarkLineMode = "Lines"            #線のみ
resources.xyMarkLineMode = "Markers"          #マークのみ
resources.xyMarkLineMode = "MarkLines"        #線とマーク
resources.xyMarkLineModes = ["MarkLines",...] #異なる条件で複数プロット

グラフのマークの種類を指定する

resources.xyMarker = 線種番号
resources.xyMarkers = [線種番号1,線種番号2,...] #異なるマークで複数プロット

グラフのマークの色を指定する

resources.xyMarkerColor = 色番号
resources.xyMarkerColors = [色番号1,色番号2,...] #異なる色で複数プロット

グラフのマークのサイズを指定する

resources.xyMarkerSizeF = サイズ
resources.xyMarkerSizes = [サイズ1,サイズ2,...] #異なるサイズで複数プロット
デフォルトのサイズは0.01

グラフにラベルをつける

resources.xyLabelMode            = "Custom" 
resources.xyExplicitLabels       = ["U","V"]   # ラベルの文字
resources.xyLineLabelFontHeightF = 0.02        # ラベルのサイズ
resources.xyLineLabelFontColor   = 2           # ラベルの色

座標軸とラベル・タイトル

タイトルをつける

resources.tiMainString    = "タイトル"

軸ラベルをつける

resources.tiXAxisString   = "x軸ラベル"
resources.tiYAxisString   = "y軸ラベル"

タイトル・軸ラベルのフォントを指定する

resources.tiMainFont      = フォント名 or フォント番号 # タイトル
resources.tiXAxisFont     = フォント名 or フォント番号 # x軸
resources.tiYAxisFont     = フォント名 or フォント番号 # y軸

軸ラベルのフォントサイズを指定する

resources.tiXAxisFontHeightF = サイズ
resources.tiYAxisFontHeightF = サイズ