- 积分
- 36026
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-7-26
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 Aires 于 2014-3-11 09:09 编辑
今天自己做了做PDO,用GrADS画PC1的时候想用bar来画,将大于0的数用红色画,小于0的用蓝色画,但是GrADS好像没有set的这个功能。在这里给大家一个比较笨的方法,但是要结合Matlab或Fortran。
思路:将大于0的序列和小于0的序列分开用不同变量存储,不想grads识别的直接设置为缺测,画的时候分别display就行了!
如果懒得用bar,也可以直接用set gxout linefill来画。还是不明白怎样用bar来画的请参照下面步骤:
这里我用matlab将处理好的PC1用fwrite写入grads默认存放格式的二进制文件,fwrite函数的使用方法,参见以前发的一个帖子:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=20308
如果不会matlab的请跳过以下内容,用Fortran处理也是一样的。可以直接看后面的ctl文件和gs文件。
以一个PC1序列为例:
PC1_larger=PC1;
PC1_lower=PC1;
PC1_larger(PC1_larger<0)=32767; % 把小于0的设为32767(随便一个缺测值均可,为了在ctl中设置undef)
PC1_lower(PC1_lower>=0)=32767; % 同理,把大于0的设为32767
PC1_lowpass=running_mean(PC1,121); %这里多了一个序列,用自己编的滑动平均,做了10年的滑动平均得到的低通序列
PC1_lowpass(isnan(PC1_lowpass))=32767; % 大家忽略这两行,这和我编的函数有关= =
PC=zeros(3,1200);
PC(1,:)=PC1_larger;
PC(2,:)=PC1_lower;
PC(3,:)=PC1_lowpass;
PC=PC(:);
接下来用fwrite函数写入grads默认存放格式的二进制文件了。
fid=fopen('d:\PC1.dat','w');
for i=1:length(PC)
count=fwrite(fid,PC(i),'float32');
end
fclose(fid);
注意:严格按照GrADS存放格式(经度、纬度、层、变量、时间)写入,否则画图会出错。
以下是对应的ctl文件:
dset d:\PC1.dat
title PC1
undef 32767
xdef 1 linear 100.0 2.0
ydef 1 linear 20.0 2.0
zdef 1 levels 1000
tdef 1200 linear Jan1900 1mo
vars 3
PC1_larger 0 99 PC1 larger than 0
PC1_lower 0 99 PC1 lower than 0
PC1_lowpass 0 99 low-pass 10 years for PC1
endvars
gs文件:
'open d:\PC1.ctl'
'set x 1'
'set y 1'
'set z 1'
'set t 1 1200'
'set xlopts 1 4 0.15'
'set ylopts 1 4 0.15'
'set vrange -3 3'
'set ylint 1'
'set gxout bar'
'set barbase 0'
***大于0的设置为红色***
'set ccolor 2'
'd PC1_larger'
***小于0的设置为蓝色***
'set ccolor 4'
'd PC1_lower'
***画低通后的序列***
'set ccolor 1'
'set cstyle 1'
'set cmark 0'
'set cthick 6'
'set gxout line'
'd PC1_lowpass'
'draw title PC1'
'printim d:\PC1.png white'
;
出图如下:
大家如果有更好的方法欢迎交流分享~
PS:@兰溪之水
兰溪的方法:用maskout函数去做,大家可以试试看!
|
评分
-
查看全部评分
|