- お知らせ
- 講座内Wikiから一部を転載しています → 講座計算機情報 - IDL tips
- IDL 5.2を想定しています
- 行き当りばったりなメモです
- 識者の意見を募集しています
- IDLのwindowがうまくforwardされない場合。
- IDL_STARTUP
- コマンドサーチパス
- 環境変数を参照する
- shell コマンドを使う
- IDLのウィンドウを消したい
- psファイルを作りたい
- Fontを大きくしたい
- Fontを変更したい
- 文字列の処理
- 数式・記号・ギリシャ文字を書くには
- プロットシンボルの自作
- 複数のプロットを一枚に載せたい
- 描画範囲の調整したい
- xyoutsやpolyfillなどで紙面の座標系で指定する
- 縦軸横軸のスケールを揃えたい
- 軸目盛を無くしたい(枠線は残す)
- 軸目盛を好きな場所(値)に打ちたい
- 軸目盛の長さや線種を変えたい
- 軸目盛の数値の書式を変えたい
- 横軸を時刻表示に直したい
- 日付計算
- メモリ間隔を変えたい
- プロットのレンジを調節したい
- データ欠測区間を飛ばしたい
- plotのとき枠だけ書きたい
- ループの回数が多すぎる
- 変数のサイズと型を知る
- 変数をキャスト(型変換)する
- 配列の連結
- 配列の次元を変換
- color table
- High resolutionの地図だと九州が消えてしまう。
- プロシージャを作成する
- emacsで
- 講座共有ライブラリ
あなたが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)のライブラリを使う場合、内部でセットされる場合がある。
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を宣言。
psファイルを作りたい
数式・記号・ギリシャ文字を書くには
TeXto?IDLを使うと便利
- http://physweb.mnstate.edu/mcraig/TeXtoIDL/
- XとPSで少し結果が変わるので注意(fontの選び方が変わる?)
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'
複数のプロットを一枚に載せたい
!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
縦軸横軸のスケールを揃えたい
例えば地図や方眼のプロットなどの場合 /isotropic を使う
IDL> plot, a, b, /isotropic IDL> map_set, 90, 0, 0, limit = [0, -180, 90, 180], $ latdel = 30, londel = 30, /grid, /azimuth, /isotropic
軸目盛を好きな場所(値)に打ちたい
- 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)の値が格納される配列。
横軸を時刻表示に直したい
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) ; 計算方法
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
配列の次元を変換
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で
- idlwaveが便利
- 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 の補完をしてくれる