Tips: GrADS


GrADSで横線が入らないように高解像度の図を作る方法

GrADSのgmfファイルをwordに張り付けたりepsファイルに変換したときに, 横線が入ってしまうことがありますが, 横線が入らないように高解像度(主に投稿論文用)のビットマップ形式の図を作る方法です.

ポイントはgmfファイルをgxepsでepsにした後, 画像処理ソフトでアンチエイリアシングなしで読み込むことです. 以下,gimpIllustratorについて説明します. 他の画像処理ソフトでも同様の方法でできると思います.

gimp

gimpでepsファイルを読み込むと,解像度やアンチエイリアシングについての設定画面になるので, ここで解像度を指定し,アンチエイリアシングなしで読み込み, 好みのファイル形式で書き出せば終了です.

Illustrator

Illustratorではepsファイルを読み込んだ後で,好みのファイル形式で書き出すときに, 解像度とアンチエイリスなしを指定します. また「オブジェクト」の「ラスタライズ」コマンドでビットマップ化するときに解像度と アンチエイリアスなしを指定することもできます.

MatlabでGrADSのステーションデータを作成する方法

GrADSのステーションデータをMatlabで作成する方法です.

1変数のsurfaceデータ

まず,本家GrADSのページ で例として挙げられている降水量データを作成するプログラム例です. 若干手抜きですが,時間や降水量等のデータはプログラム内で定義しています.

outname='station.grd';

lat(1:4)=[34.3 44.2 22.4 33.4]; 
lon(1:4)=[-85.5 -84.5 -83.5 -82.5]; 
rain(1:4,1:2)=[123.3 145.1; 87.1 871.4; 412.8 223.1; 23.3 45.5];

stid(1,1:8)='     QQQ'; stid(2,1:8)='     RRR';
stid(3,1:8)='     SSS'; stid(4,1:8)='     TTT';

fid=fopen(outname,'w');
tim=0;  % とりあえず0でよい.指定した時間からずれる時に使用するらしい.
nlev=1; % surfaceデータでは1.
flag=1; % surfaceデータがあるときは1,それ以外は0.

for tt=1:2
  for ii=1:4
    count=fwrite(fid,stid(ii,:),'char');
    count=fwrite(fid,[lat(ii) lon(ii) tim],'float32');
    count=fwrite(fid,[nlev flag],'int32');
    count=fwrite(fid,rain(ii,tt),'float32');
  end

  nlev=0; % 以下の出力は時間の区切りを示すので,nlev=0とする.
          % stidやlat,lonの値はここでは意味を持たない.
  count=fwrite(fid,stid(ii,:),'char');
  count=fwrite(fid,[lat(ii) lon(ii) tim],'float32');
  count=fwrite(fid,[nlev flag],'int32');
  nlev=1;
end
fclose(fid);

このプログラムで出力されるstation.grdを読むctlファイルは次のようになります.

DSET ^station.grd 
DTYPE  station
STNMAP ^station.map
TITLE  Rainfall 
UNDEF  -1.0e+10
TDEF    2 LINEAR jan1980 1mo 
VARS    1
v1    0 99 Rainfall
ENDVARS

ただし,ctlファイルをopenする前に,次のコマンドをターミナル上で実行して,station.mapを 作成する必要があります.

$ stnmap -i station.ctl

複数変数のsurfaceデータ

次は2変数のsurfaceデータの場合ですが,プログラムは1変数の場合とほとんど同じです. 風速のデータを追加します.

outname='station.grd';

lat(1:4)=[34.3 44.2 22.4 33.4]; 
lon(1:4)=[-85.5 -84.5 -83.5 -82.5]; 
rain(1:4,1:2)=[123.3 145.1; 87.1 871.4; 412.8 223.1; 23.3 45.5];
wind(1:4,1:2)=[8.15 9.06; 1.27 9.13; 6.32 0.98; 2.79 5.47]; % 追加

stid(1,1:8)='     QQQ'; stid(2,1:8)='     RRR';
stid(3,1:8)='     SSS'; stid(4,1:8)='     TTT';

fid=fopen(outname,'w');
tim=0;
nlev=1; % surfaceデータでは1.
flag=1;

for tt=1:2
  for ii=1:4
    count=fwrite(fid,stid(ii,:),'char');
    count=fwrite(fid,[lat(ii) lon(ii) tim],'float32');
    count=fwrite(fid,[nlev flag],'int32');
    count=fwrite(fid,[rain(ii,tt) wind(ii,tt)],'float32'); % 変更
  end

  nlev=0;
  count=fwrite(fid,stid(ii,:),'char');
  count=fwrite(fid,[lat(ii) lon(ii) tim],'float32');
  count=fwrite(fid,[nlev flag],'int32');
  nlev=1;
end
fclose(fid);

ctlファイルは次のようになります.

DSET ^station.grd 
DTYPE  station
STNMAP ^station.map
TITLE  Rainfall 
UNDEF  -1.0e+10
TDEF    2 LINEAR jan1980 1mo 
VARS    2
v1    0 99 Rainfall
v2    0 99 wind speed
ENDVARS

レベルデータ

最後はレベルデータの場合です.レベルを0と100の2層に設定しています.

outname='station.grd';

lat(1:4)=[34.3 44.2 22.4 33.4]; 
lon(1:4)=[-85.5 -84.5 -83.5 -82.5]; 
level(1:2)=[0 100]; % レベルを2層とする
wind1(1:4,1:2)=[123.3 145.1; 87.1 871.4; 412.8 223.1; 23.3 45.5];
wind2(1:4,1:2)=[8.15 9.06; 1.27 9.13; 6.32 0.98; 2.79 5.47];

stid(1,1:8)='     QQQ'; stid(2,1:8)='     RRR';
stid(3,1:8)='     SSS'; stid(4,1:8)='     TTT';

fid=fopen(outname,'w');
tim=0;
nlev=2; % レベルを2層に設定.
flag=0; % surfaceデータではないので0

for tt=1:2
  for ii=1:4
    count=fwrite(fid,stid(ii,:),'char');
    count=fwrite(fid,[lat(ii) lon(ii) tim],'float32');
    count=fwrite(fid,[nlev flag],'int32');
    count=fwrite(fid,[rain(ii,tt) wind(ii,tt)],'float32');
    count=fwrite(fid,[level(1) wind1(ii,tt)],'float32'); % 値をレベル毎に書き込む
    count=fwrite(fid,[level(2) wind2(ii,tt)],'float32');
  end

  nlev=0;
  count=fwrite(fid,stid(ii,:),'char');
  count=fwrite(fid,[lat(ii) lon(ii) tim],'float32');
  count=fwrite(fid,[nlev flag],'int32');
  nlev=2;
end
fclose(fid);

ctlファイルは次のようになります.

DSET ^station.grd 
DTYPE  station
STNMAP ^station.map
TITLE  Rainfall 
UNDEF  -1.0e+10
TDEF    2 LINEAR jan1980 1mo 
VARS    1
v1    2 99 wind speed 
ENDVARS

GrADSでctlファイルを開いた後,レベルを指定する時には,

set lev 0
set lev 100

とします.ctlファイル内にレベルの値の情報は含まないのでやや不便です.

Homeに戻る