IDL tips

counter

お知らせ
講座内Wikiから一部を転載しています 講座計算機情報 - IDL tips
IDL 5.2を想定しています
行き当りばったりなメモです
識者の意見を募集しています

あなたがIDLで良く使う技を教えてください.

IDLのwindowがうまくforwardされない場合。

以下のようにするとうまくいくかもしれません。

  • 適当なファイル(例えば~/.Xresources-idl)に、以下のように書く。
    • idl.gr_visual: TrueColor?
% xrdb -m ~/.Xresources-idl

カラーがうまく表示されない場合

IDL> device, decompose=0

他のwindowに隠れた後、再描画されない場合

IDL> device, retain=2

retainはグラフィックスの再描画をコントロール 0:再描画しない、1:Window Systemが行う、2:IDLが行う

関連コマンド

IDL> help, /device
% xdpyinfo

IDL_STARTUP

環境変数 IDL_STARTUP でファイルを指定しておくと、 idl起動時に実行される

pathの追加やdeviceの設定を記述しておくと良い

% setenv IDL_STARTUP ~/idl/startup.pro

環境変数は各自の ~/.cshrc 等に設定を書く

cdfやgo(SuperDARN)のライブラリを使う場合、内部でセットされる場合がある。

コマンドサーチパス

IDLのシステム変数 !path に格納されている

自分のプロシージャ・関数ライブラリ(仮に ~/IDL/lib として)を 追加するには以下の通り。:で区切る。

!path = !path + ':' + '~/IDL/lib'

pathを切っておくと

自作のプロシージャや関数が必要な場所で、自動的にコンパイルされる。 (ファイル名が、「プロシージャ名.pro」や「関数名.pro」の場合)

なので、startup等でpathを切る処理をしておくと良い

環境変数を参照する

getenv('変数名') を使う

datafile = getenv('WORKDIR') + '/data/GEOTAIL/‥'

shell コマンドを使う

$ または spawn を使う

IDL> spawn, 'gv --swap idl.ps'

spawnは、引数にコマンドの文字列を書く。 また結果を配列に格納することが出来る。

IDL> $ls
IDL> spawn, 'ls'
IDL> spawn, 'cat ' + datafile + ' | wc -l', result
IDL> data = fltarr(10, result(0))

wc -lで調べたdatafileの行数がresult(0)に入る。その大きさの配列dataを宣言。

IDLのウィンドウを消したい

IDLの描画ウィンドウを閉じたいとき

IDL> wdelete

IDLの描画ウィンドウの内容を消したいとき

IDL> erase

psファイルを作りたい

IDL> set_plot, 'ps'        ; psへ
IDL> set_plot, 'x'         ; 画面(X)へ (unix/linux)
IDL> set_plot, 'win'       ; 画面へ (windows)

参考 procedure

http://10.226.83.235/local/library/?IDL+ps

Fontを大きくしたい

デフォルトのプロットではプレゼンでキャプションが見えないことがある

IDL> !x.charsize=1.5

Fontを変更したい

恰好良いフォントを使う

IDL> set_plot, 'ps'
IDL> !p.font = 0
IDL> device, /helvetica, /bold

文字列の処理

文字列に変換する

string(data)
string(data, format='(i4.4)')

文字列内の連続する空白をまとめる

strcompress( )

数式・記号・ギリシャ文字を書くには

TeXto?IDLを使うと便利

IDL> print, textoidl('\phi')
!7u!x
IDL> set_plot, 'ps'
IDL> print, textoidl('\phi')
!mf!x

フォントを変える

  • !9でフォントを symbol に指定,!xで通常に戻る.
title = '!9' + string(68b) + '!xH [nT]'              ; ギリシャ文字デルタ
title = 'Wind Direction [!9'+string(176b)+'!x]'      ; degree
  • !cで改行

文字位置

  • !eで指数、!iで添字、!nで戻す
  • !sで位置を保存、!rで位置を復元(スタック)

詳細はIDL user's guide p.112-113 9章を参照。

フォントの確認

IDL> showfont, 4, 'Simplex Greek'

などとすると表示できる

アルファベットとギリシャ文字の対応(?)

αβγδεζηθικλμνξοπρστυΦχψω
abcdefghijklmnopqrstuvwx

たとえば「α-ratio」と表示するなら

ytitle = '!4a!x-ratio'

プロットシンボルの自作

IDL> usersym, 〜           ;と指定
IDL> plot, 〜, psym = 8    ;とする

参考プロシージャ

複数のプロットを一枚に載せたい

!p.multiを使う

  • !p.multi(0) = 0 で改ページ(=初期化)できる
  • !p.multi(1) columns数
  • !p.multi(2) raws数
  • !p.multi(3) z方向(=重ね書き)数
  • 図の数に応じてキャプション等が縮小されるので注意

plotプロシージャの中で position=[x0,y0,x1,y1] を使うと、 自分の好きなようにプロットを並べることができます。

/noeraseを使う

  • 重ね書きができる(ページ切替えを抑制)
  • あわせてpositionやframeを指定
  • 字の大きさは変わらない
plot, data(0,*), data(1,*), position = [0, 0,   1.0, 0.5]
plot, data(0,*), data(1,*), position = [0, 0.5, 1.0, 1.0], /noerase

描画範囲の調整したい

Fontを大きくしたときなど Bounding Boxからはみ出したときは

  • position
  • region

xyoutsやpolyfillなどで紙面の座標系で指定する

/normal を使う

IDL> xyouts, 0.5, 0.5, 'string', /normal

→ 紙面中央にstringと表示

縦軸横軸のスケールを揃えたい

例えば地図や方眼のプロットなどの場合 /isotropic を使う

IDL> plot, a, b, /isotropic
IDL> map_set, 90, 0, 0, limit = [0, -180, 90, 180], $
        latdel = 30, londel = 30, /grid, /azimuth, /isotropic

軸目盛を無くしたい(枠線は残す)

IDL> plot, a, b, $
        xstyle = 1, xminor = 1, xticks = 1, xtickname = [' ', ' ']

軸目盛を好きな場所(値)に打ちたい

  • xtickv = [◯, ◯, ◯] と指定する
  • xticksをnと指定した場合は、n+1の要素が必要
IDL> plot, a, b, $
        xticks = 3, xtickv = [10, 20, 30, 50]

軸目盛の長さや線種を変えたい

ticklen

  • xticklenを指定する。
    • 0.5で(端から端までの)罫線となる
    • 負の値で外向きになる
IDL> plot, a, b, $
        xticklen = 0.5, yticklen = -0.005

gridstyle

目盛りの線種は0〜5まで指定できる。0がdefaultの実線。 ticklen = 0.5のときなどにあわせて使うと良い。

IDL> plot, a, b, $
        xticklen = 0.5, xgridstyle = 1, yticklen = 0.5, ygridstyle = 2

特定の値にのみ点線を引く場合などは、手動でoplotする方が楽かも。

IDL> plot, a, b, /nodata  ;枠線のみ描画
IDL> if ((!y.crange(0) - 0) * (!y.crange(1) - 0)) lt 0 then $
        oplot, !x.crange, [0, 0], psym = -3, linestyle = 5
IDL> oplot, a, b

![x,y,z].crangeは、plot枠の上端(1)・下端(0)の値が格納される配列。

軸目盛の数値の書式を変えたい

非常に大きな数値の場合,自動的に有効数字標記となる。 これを変更するには tickformat を指定する

IDL> plot, a, b, ytickformat = '(i)'   ; 整数に
IDL> plot, a, b, xtickformat = '(a1)'   ;目盛りのみ(数値は表示しない)
IDL> !y.tickformat = '(f10.2)'         ; 10桁,小数第2位まで

注意

ただし数値がフォーマット指定の範囲を越えると、 数字の代りに * が出力されてしまう。

横軸を時刻表示に直したい

juldayとlabel_dateを活用しましょう。

‥IDL 5.2 だと期待通り動作しません(誤差の丸め方などが原因?)

label_date_2

5.2用に作ってみました http://10.226.83.235/local/library/?IDL+label_date_2

日付計算

julday と caldat を使う

x = julday(month, day, year)          ; julian day
x = x + 1                               ; 次の日
caldat, long(x), month, day, year     ; 変換
y = julday(month + 1, 1, year)        ; 次の月
caldat, long(y), month, day, year     ; 変換

julday で時刻を扱う時の注意点

日付のみなら上の通りで整数型だが、時刻を含めて小数表記する場合は注意を要する

  • データの精度が不足する(特にデータの時間分解のが高い場合)
    • 開始時刻を0として、差分で扱うとより良いらしい
  • 12時が.0である
x = julday(month, day, year, hour, min, sec)    ; 計算方法

メモリ間隔を変えたい

[x,y,z]ticks, [x,y,z]minorを使いましょう。

プロットのレンジを調節したい

xrange = [0, 86400], xstyle = 1

などと指定する.

データ欠測区間を飛ばしたい

2つの方法

max_value, min_value

max_value, min_value を指定,データファイルには範囲外の欠測値を入れておく

NaN

データが NaN であれば無視するので,欠測値としてNaNを入れたデータファイルや中間ファイルを用意する

  • plotやoplotなどではNaNは自動的に飛ばされる
  • maxやminではキーワード /NaN をつける必要がある
    • (他にもそのようなproがあるかもwhereとか?)
IDL> print, max(data(0, *), /NaN)

plotのとき枠だけ書きたい

/nodataをつける

IDL> plot, a, b, /nodata

複数のプロットを1つの枠に書きたいとき(軸目盛りが共通の場合)

配列の連結を使って

IDL> plot, t, [Bx, By, Bz], /nodata
IDL> oplot, t, Bx, color = 255
IDL> oplot, t, By, color = 128
IDL> oplot, t, Bz, color = 64

配列を連結する他にも最大・最小を取り出して配列とする方法なども。

IDL> dummy = [max(data(1, *)), min(data(1, *)), max(data(2, *)), min(data(2, *))]
IDL> plot, replicate(data(0, 0), 4), dummy, /nodata
IDL> oplot, data(0, *), data(1, *), color = 255
IDL> oplot, data(0, *), data(2, *), color = 64

ループの回数が多すぎる

デフォルトでは制御変数はshortで定義される。 これで足りない場合は例えば0からの場合、 0L とlongであることを明示すればよい。

for i = 0L, N - 1 do begin
  処理
endfor

変数のサイズと型を知る

size()

変数をキャスト(型変換)する

float()
fix()

配列の連結

配列a, bで

a = [a, b]

配列の次元を変換

reformを使う

num_of_data = n_elements(data) / 6
data_new = reform( data, 6, num_of_data )
 or
data = reform(data, 6, num_of_data, /overwrite)

/overwrite で上書き

color table

loadct

IDL> loadct.39

tvlct

TVLCT allows a user to load a color table which he has already defined. After defining the red, green, and blue intensity profiles, type:

IDL> tvlct, red, green, blue

to load the color table. If you wish to read the color table which is currently loaded, type:

IDL> tvlct, red, green, blue, /get

High resolutionの地図だと九州が消えてしまう。

  • ”map_continents"コマンドを"/coast, /hires”オプションをつけて使う。
map_set,30,130,limit=[25,125, 35,135] 
map_continents,/hires,/coast
  • GMTを使う…freeやし…。 (^_^;

プロシージャを作成する

pro myplot, data1, data2, keyword1 = key1, keyword2 = key2
  …処理を記述…
end
  • data1, data2はパラメータ、keyword1, keyword2はキーワードと呼ぶ。
  • キーワードは、プロシージャを呼ぶ際、省略可能(その場合0となる?)
  • パラメータは必須

キーワードの有無を判定

if n_elements(key1) eq 0 then …

if keyword_set(key1) …

など。keyword_setの場合key1の内容が0の場合もfalseになるので注意。

キーワードの継承

  • _extra を使う
  • プロシージャの定義で指定されていない未知のキーワードが格納される
  • プロシージャ内部で呼び出されるプロシージャに継承させることが可能
pro myplot, data, key = key, _extra = e
  …何かの処理…
  plot, data2, key = key2, _extra = e
end

とすると、myplotを呼び出す際に記述されたキーワードを使って、plotを実行することができる。

  • 内部で同じ値を使う場合、_extraの値によって上書きされるので注意

emacsで

  • procedure のキーワードに色が付く
  • loopや行の続き($)を字下げして見易くする
  • M-x idlwave-shell などとしてcompileできる
    • C-cC-dC-cでsave and .run
    • C-cC-sでIDL起動
    • compile error時に,procedure の error個所を示してくれる
    • tab (C-i) で command の補完をしてくれる

講座共有ライブラリ

サンプルプログラムはこちらも参照のこと