爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 27473|回复: 35

[分享资料] 分享set gxout bar如何设置不同颜色绘图

  [复制链接]

新浪微博达人勋

发表于 2014-3-10 21:20:53 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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'
;

出图如下:
PC.png
大家如果有更好的方法欢迎交流分享~
PS:@兰溪之水
兰溪的方法:用maskout函数去做,大家可以试试看!


评分

参与人数 2金钱 +29 贡献 +11 收起 理由
mofangbao + 15 + 5
kongfeng0824 + 14 + 6

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-10 22:37:06 | 显示全部楼层
恩,给斑竹辛苦分享赞一个~这些方面的确在NCL上比较方便!各有各的好处~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2014-3-11 08:26:48 | 显示全部楼层
直接用maskout函数就可以轻松实现。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-11 09:04:32 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-11 09:28:46 | 显示全部楼层
很好啊,谢谢分享。楼主推荐几个matlab入门教程吧,最近安装了matlab想学习一下。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-11 10:09:14 | 显示全部楼层
学习一下     
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-11 12:37:05 | 显示全部楼层
river 发表于 2014-3-11 09:28
很好啊,谢谢分享。楼主推荐几个matlab入门教程吧,最近安装了matlab想学习一下。

入门教程真的有很多的,咱家园也有很多的,市面上的书也很多的,随便找一本来学学基本的就够了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-11 14:10:12 | 显示全部楼层
之前回答过这种问题[http://bbs.06climate.com/forum.php?mod=viewthread&tid=20580]。分块填色最直接的方法就是把需要用不同颜色的区域分开。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-11 16:45:36 | 显示全部楼层
沙颖凯 发表于 2014-3-11 14:10
之前回答过这种问题[http://bbs.06climate.com/forum.php?mod=viewthread&tid=20580]。分块填色最直接的方法 ...

嗯,这个是把它放到grads里面去画的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-5-18 19:54:04 | 显示全部楼层
赞!前几天也遇到同样的问题了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表