top of page
​​Ferretメモ
Ferretは、グリッドデータセットを扱う海洋・気象学者向けの可視化・分析プログラムです。このプログラムは、90年代半ばに米国NOAA/PMELのTMAPグループによって開発され、最近ではもっともユーザーの増えつつある可視化プログラムだと思います。以下は、私がferretを利用する際のメモです。クイックガイドとしてご利用ください。 


1. 環境変数の設定

1.1. loginファイルに、FerretのPathスクリプトを読ませる指示を書く。
(.cshrcに書足す): source /usr/local/bin/ferret_paths

1.2. loginファイルに、自分で作ったGo scriptファイル(.jnlファイル)のディレクトリPathを通しておく。
(.cshrcに書足す): setenv FER_GO /$HOME/local/ferret/go


2. 起動

2.1. デフォルトの起動
  > ferret

2.2. 出力windowなしで起動
  > ferret -unmapped

2.3. GUIを起動
  > ferret -gui

2.4. 画像出力をgif形式にする際の起動
  > ferret -gif

2.5. スクリプトを作動させる
  > ferret -script yomikomi.jnl


3. データの読み込み
3.1. データファイルの読み込み
  yes? set data xxx (xxxはファイル名)
  or
  yes? use xxx

3.2. データの確認
  yes? show data

3.3. グリッドの確認
  yes? show grid xxx (xxxは変数名)


4. 変数のプロット
4.1. 描画
  ! 1次元プロット
  yes? plot myvar[x=110E, y=75N, l=1:365]

  ! 2次元プロット
  yes? shade myvar[x=90E:110E, y=65N:75N, l=1:365@AVE]

4.2. 特定地域の平均値を出力
  yes? shade myvar[x=90E:110E@DIN, y=65N:75N@DIN, l=1:365@AVE]
  @DINで特定グリッドの面積をかけてくれる。

4.3. 装飾
4.3.1. 陸地・海洋・格子を書く
  yes? go land

4.3.2. タイトルを変更
  yes? SET MODE/TITLE="BIOMASS (MgC/ha)"

4.4. 演算
  yes? shade myvar[x=90E:110E, y=65N:75N, l=1:365@AVE]*0.05
  0.05をかける。

4.5. ハードコピー出力
  ! metafile作成モードにする
  yes? SET MODE METAFILE
  これで、プロットの度に、metafile.plt.~n~というファイルが作られる。

  ! ferretを終了させ、psファイルを作る。
  > Fprint metafile.plt.~n~ -o xxx.ps
  これは、gksm2psを利用した簡易コマンドである。gksm2psで作成しても可。

  ! 中間ファイルを消す
  > Fpurge ferret.jnl
  or
  > Fpurge metafile.plt

  ! Ferretを終了せずに、metafileにアクセスできるようにする
  yes? PPL CLSPLT

4.6. ウィンドウ
  ! 新しいウィンドウを開く
  yes? SET WINDOW/NEW

  ! ウィンドウのサイズを変える
  yes? SET WINDOW/SIZE=.5
  デフォルトは0.7

  ! ウィンドウの縦横比を変える
  yes? SET WINDOW/ASPECT=.5
  デフォルトは0.75

4.7. プロットカラーの間隔を変える
  ! 2ずつの目盛り配色
  yes? shade/lev=2D my_var

  ! ゼロをセンターにした配色
  yes? shade/lev=2C my_var

  ! 20色で配色
  yes? shade/lev=20 my_var

  ! -10から20まで、2ずつの目盛り配色
  yes? shade/lev=(-10,20,2) my_var

4.8. データの再グリッディング
  yes? define axis/x=0E:0.5W:0.5 xax ! 0.5度ごとのグリッドにきりなおす
  yes? define axis/y=90S:89.5N:0.5 yax ! 0.5度ごとのグリッドにきりなおす
  yes? define grid/x=xax/y=yax xyax
  yes? shade var[g=xyax]; go land

4.9. 2種類のデータの差分と無データグリッドに-9999を入れる

  ! 2つのデータセットで、無データグリッドには-9999を、
    有データグリッドは0を入れ変数aに格納
  yes? let a = IF (data1[d=1,g=xyax] EQ 0) AND (data2[d=2,g=xyax] EQ 0)) THEN (-9999) ELSE 0

  ! 2つのデータセットの差をとった結果を変数bに格納
  yes? let b = (data1[d=1,g=xyax,l=@ave])-(data2[d=3,g=xyax])

  ! 無データグリッドを-9999にしたので、
    -6から6のレンジで図化すると無データは白抜きになる
  yes? shade/lev=(-6,6,1) b+a[l=1]; go land

  ! 結果をtest.ncファイルとして保存
  yes? save/file=test.nc b+a[l=1]

4.10. 軸の変更

  ! 細かい時間軸の目盛りを消す
  yes? ppl tics,0,0.125
  yes? ppl plot

  ! 時間軸を設定しなおす
  yes? plot/hlimits=1-jan-1875:31-dec-2100 myvar

  ! x=0, y=0の軸を書く
  yes? ppl cross 1
  yes? plot myvar


5. Unix tool
5.1. パスの追加
  > Faddpath ~/tmp/data

5.2. マニュアルの検索
  > Fapropos xxx (xxxはデータファイル名の一部で可)

5.3. データフィルの検索
  > Fdata xxx (xxxはデータファイル名の一部で可)

5.4. descriptorファイルの検索
  > Fdescr xxx

5.5. 環境変数の出力
  > Fenv

5.6. スクリプトファイルの検索
  > Fgo xxx (xxxはスクリプト名の一部で可)


6. バッチモードでの利用法 
6.1. バッチモード(unixコマンドライン)でスクリプトを動かす
  ferret < my_ferret_script.jnl
  or
  ferret < my_ferret_script.jnl > script_output.txt
  or
  ferret -script my_ferret_script.jnl
  
  以下のようなコマンド入力で、スクリプトを動かすこともできる


  ferret << STOP
  plot/i=1:10 i
  list/i=1:10 i*3
  STOP

6.2. 終了せずに、バッチモード(unixコマンドライン)でスクリプトを動かす
名前つきパイプを利用して処理する。
  ! パイプを作成する
  mknod ferret_commands p

  ! ferretをスタート
  cat >> ferret_commands &
  ferret < ferret_commands &

  ! スクリプトをラン
  cat my_script.jnl >> ferret_commands


7. 直接アクセスバイナリデータ
7.1. データの読み込み
  yes? DEFINE AXIS/X=1:10:1 x10      ! x軸のグリッド数の設定
  yes? DEFINE AXIS/Y=1:5:1 y5       ! y軸のグリッド数の設定
  yes? DEFINE GRID/X=x10/Y=y5 g10x5    ! グリッドの指定
  yes? FILE/VAR=MYVAR/GRID=g10x5/FORMAT=stream/type=r8 myfile.dat   ! myfile.datを読み込む際の設定(実数8バイト: r8, 整数1バイト: i1)


7.2. 縦軸を逆転させる
  yes? fill xxx
  yes? ppl yaxis,360,0
  yes? ppl fill


7.3. 縦軸を逆転させる
  yes? use coads_climatology
  yes? show data
    currently SET data sets:
  1> /opt/local/ferret/fer_dsets/descr/coads_climatology.des 
  (default)
  name  title                    I    J    K    L
  SST   SEA SURFACE TEMPERATURE  1:180  1:90  ...  1:12
  AIRT  AIR TEMPERATURE         1:180  1:90  ...  1:12
  SPEH  SPECIFIC HUMIDITY         1:180  1:90  ...  1:12
  WSPD  WIND SPEED             1:180  1:90  ...  1:12
  UWND  ZONAL WIND             1:180  1:90  ...  1:12
  VWND  MERIDIONAL WIND         1:180  1:90  ...  1:12
  SLP   SEA LEVEL PRESSURE       1:180  1:90  ...  1:12

  ! 逆転させた軸を定義する
  yes? let reverse_j = 90 - j[g=sst]
  yes? let sst_reverse_j = samplej(sst,reverse_j)
  yes? shade/j=45:90/l=1/lev=20c sst-sst_reverse_j


7.4. 4byte float形式での保存
  yes? list/format=stream/file="myvar.flt"/clobber/nohead myvar


7.5. 緯度方向に逆さまな4バイト直接アクセスバイナリファイルを、
   正しい方向に反転して、座標ヘッダを付け加えて、netcdfファイルに保存する

  ! 仮の軸を定義して、バイナリファイルを読み込む
  yes? define axis/x=1:750:1 x750
  yes? define axis/y=1:600:1 y600
  yes? define grid/x=x750/y=y600 g750x600
  yes? file/var=myvar/grid=g750x600/format=stream/type=r4 Japan_elev.dat

  ! 逆転させた軸を定義して、そのままバイナリファイルとして保存
  yes? let reverse_j = 600 - j[g=myvar]
  yes? let myvar_rj = samplej(myvar,reverse_j)
  yes? shade myvar[g=g750x600]
  yes? shade myvar_rj
  yes? list/format=stream/file="Japan_elev_rj.flt"/clobber/nohead myvar_rj

  ! 正しい座標軸を定義し、先ほどの逆転したバイナリファイルを読み込む
  yes? define axis/x=125.03E:150E:3.33333E-2 x750
  yes? define axis/y=30N:49.9999N:3.33333E-2 y600
  yes? define grid/x=x750/y=y600 g750x600
  yes? file/var=myvar/grid=g750x600/format=stream/type=r4 JMIP_elev_big_rj.dat

  ! endianコードを変更する場合
  yes? set data/ez/swap/var=myvar/grid=g750x600/format=stream/type=r4 JMIP_elev_big_rj.dat

  ! netcdfで保存
  yes? shade myvar
  yes? save/file="Japan_elev_rj.nc" myvar

  ! (ferretは、一旦付いた軸情報を変更できないようで、
    正しい方向に回転させてバイナリとして保存&再読するか、
    fortranやcで直接読んで回転させるしかないらしい。)


7.6. 平均季節変化を求める

  ! 新しくt軸を定義して、moduloで平均季節変化を計算
  yes? define axis/t="16-JAN-0001":"16-DEC-0001":1/units=months/calendar=noleap/T0="16-DEC-0000"/modulo tax
  yes? plot flux_land[d=1,x=@din,y=@din,gt=tax@mod]

  ! シンプルにもできる
  yes? plot flux_land[d=1,x=@din,y=@din,gt=month_noleap@mod]

  ! 時間軸がdecimal yearで書いてあるとき2002.5など)
  yes? define axis/t=`1/24`:`23/24`:`1/12`/modulo tax
  yes? plot flux_land[d=1,x=@din,y=@din,gt=tax@mod]

  ! anomalyを求める
  yes? define axis/t=`1996+1/24`:`2004+23/24`:`1/12` tax1 
  yes? define axis/t=`1/24`:`23/24`:`1/12`/modulo tax2
  yes? let anom = flux_land[d=1,gt=tax@asn]-flux_land[d=1,gt=tax1@mod]
  yes? plot anom[d=1,x=@din,y=@din]
  yes? plot/t=1996:2005 flux_land[d=1,gt=tax@asn,x=@din,y=@din], flux_land[x=@din,y=@din,d=1,gt=tax1@mod], anom[x=@din,y=@din]


7.7. 12行x13列の図パネルを作る

  ! small_viewで12行x13列の図の大きさと開始位置を決定。なお、最大200枚までしか図を張れないようだ。
  yes? go small_view 12, 13, 0.066, 0.02, 0.005, 0.07, 0.02, 0.01, vv
  yes? set view vv11; ppl axlabp 1,-1; ppl tics .1,.1,.1,.1; shade/nolab/nokey/lev=(-inf)(-200,200,20)(inf) ann_anom1[t=1996.5]; go land
  yes? set view vv21; ppl axlabp 0,-1; ppl tics .1,.1,.1,.1; shade/nolab/nokey/lev=(-inf)(-200,200,20)(inf) ann_anom1[t=1997.5]; go land

  ! small_viewの定義は、以下の通り。CB_xsize,CB_ysizeは不要
  yes? go small_view [rows],[columns],[xsize],[xstart],[xgap],[ysize],[ystart],
                 [ygap],[view_name_prefix],[CB_xsize],[CB_ysize]

  ! 図の配置は、以下の通り。

   | v11 | v12 | v13 |
   | v21 | v22 | v23 |
   | v31 | v32 | v33 |

  ! 5行x3列までならmulti_viewでもいける
  yes? go multi_view 5, 3, 0.25, 0.05, 0.1, 0.15, 0.05, 0.05, vv

  ! 1行11列目が11行1列目と認識されてしまうため(どちらもvv111になるから)、そこだけ別のviewportを定義
  yes? go small_view 1, 1, 0.066, 0.73, 0.005, 0.07, 0.90, 0.005, vvs
  yes? set view vvs11; ppl axlabp 1, 0; ppl tics .1,.1,.1,.1; shade/nolab/nokey/lev=(-inf)(-200,200,20)(inf) ann_anom11[t=1996.5]; go land


7.8. JJA, DJF平均値の計算

  ! JJA (L軸に月データが入っている場合)
  yes? set memory/size=150
  yes? use input_file_mon.nc
  yes? save/file=jja.nc/CLOBBER GPP[l=5:7@ave]
  yes? save/file=jja.nc/APPEND NPP[l=5:7@ave]

  ! DJF
  yes? set memory/size=150
  yes? use input_file_mon.nc
  yes? let GPP_djf = (GPP[l=1:12@sum]-GPP[l=3:11@sum])/3  ! @sumを使わないと、L軸が残ってしまう。
  yes? set var/outtype=float GPP_djf              ! 倍精度を単精度に変換
  yes? save/file=djf.nc/CLOBBER GPP_djf
  yes? let NPP_djf = (NPP[l=1:12@sum]-NPP[l=3:11@sum])/3
  yes? set var/outtype=float NPP_djf
  yes? save/file=djf.nc/APPEND NPP_djf


8. その他
8.1. HDF形式からnetCDF形式への変換
  1) HDFライブラリとヘッダをインストールする。
  http://www-pablo.cs.uiuc.edu/Software/Pablo/HDFLibrary/HDFLibrary.htm

  2) binディレクトリ内のncdumpとncgenを、hdfdumpとhdfgenに名前を変更する。
  
  3) UCAR netCDFライブラリとヘッダ(ncdumpとncgenを含む)をインストールする。
  http://my.vector.co.jp/servlet/System.FileDownload/download
  /ftp/0/45956/pack/solaris/sparc/net/netcdf_2.4.3_sparc.pkg.tar.gz
  
  4) hdfdump(HDFライブラリ)とncgen(netCDFライブラリ)にpathが通っていることを確認する。

  5) > hdfdump xxx.hdf | ncgen -b -o xxx.nc


8.2. 変数名についての注意事項
   gtool形式のデータをnetCDFに変換する際に、変数名がx, y, z, tだと、ferret内部の軸名と重なってしまい、
   グリッドデータがなくなります。例としては、show grid Tとかすると、X,Y,Z,Tになにもなくて、
   abstractに9999999rとかが書き込まれます。とりあえずの対処法として、gthead等でITEM名を変更してください。

  > gthead T out:Ta ITEM/Ta  ! TからTaに変数名を変更


8.3. 画像変換
  ImageMagickというソフトのconvertというコマンドでpsファイルからjpegファイルに変換。

  ! qualityを100%に設定
  > convert -quality 100 lai_amazon.ps lai_amazon.jpg 

  ! モアレといわれる縞模様が出た場合、拡大と縮小を行う
  > convert -density 720 -resize 20% lai_amazon.ps lai_amazon.jpg 

  ! もしくは、mogrifyですべてのpsファイル一発変換
  > mogrify -quality 100 *.ps jpg 

  ! もしくは、ghostscriptを利用して、変換する方法もある(解像度300dpi)
  > gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -dAlignToPixels=0 -sOutputFile=lai_amazon.jpg -r300 -dGridFitTT=0 lai_amazon.ps 

  ! Fprintで、デフォルトの縦長なpsファイルが作られている場合、convertでは変なトリミングをされてしまうので、
   Fprint時にオプションをつけてあらかじめ横長のpsファイルにする
  > Fprint -p portrait lai_amazon.plt -o lai_amazon.ps 


8.4. グリッドマップでlongitudeに、緯度をあらわすWやEが入らない

  ! ncoコマンドを利用して、longitudeのunitsを変更。
  > ncatted -a units,longitude,m,c,"degree_east" test.nc test2.nc 


8.5. lon, latをシフトさせる

  ! NCOの場合
  > ncap2 -s 'lon=lon+1.00; lat=lat+0.25' infile.nc outfile.nc 

  ! CDOの場合: 書き出した情報を変更する
  > cdo grides infile.nc > mygrid ! このmygridの内容を変更
  > cdo setgrid,mygrid infile.nc outfile.nc 


8.6. 領域を指定して切り出し

  ! NCO
  > ncks -d lon,-25.5,63.5 -d lat,25:72.5 infile.nc outfile.nc 


8.7. 変数名の変更

  > ncrename -O -v GPP_DJF,GPP infile.nc outfile.nc 


8.8. 月データを年データに平均

  > cdo yearmean infile.nc outfile.nc 

  > cdo timselmean,12 infile.nc outfile.nc 

  > cdo timselmean,12,0,0 infile.nc outfile.nc 

  ! JJA
  > cdo timselmean,3,6,9 infile.nc outfile.nc 
bottom of page