爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 29597|回复: 10

[脚本编辑] 基于opengrads脚本subplot.gs的一页多图的改进

[复制链接]

新浪微博达人勋

发表于 2017-9-26 14:54:59 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 普鲁斯特 于 2017-9-27 05:38 编辑

一页多图不是一个新鲜的话题了,论坛里的帖子已经讲得很详细,也在此向前辈们致敬~

但我可能更喜欢适合自己的脚本,于是根据opengrads里的脚本subplot.gs修改了下。
附件里两个文件:subplot_x根据行来画,subplot_y按列来画。数据采用的是ncep reanalysis II 2010年的。色卡是用调色板调的
色标采用仿matlab格式:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=9294
  1. *
  2. * Subplot(m,n,frame) - Like Matlab function subplot().
  3. * Usage: subplot_x m n frame
  4. *          m       :   the number of rows
  5. *          n        :   the number of columns
  6. *          frame  :   the figure to draw
  7. * Examples:
  8. *         'subplot_x 2 2 1'
  9. *           |------| |------|
  10. *           |plot1| |plot2|
  11. *           |------| |------|
  12. *           |plot3| |plot4|
  13. *           |------| |------|      
  14. *           'subplot_x 3 1 1'
  15. * Notes:
  16. *           plot 1st row first, then 2nd row, ...
  17. * Modified by Nanshui. Sep 27, 2017.

  18. function subplot(args)

  19.    m     = subwrd(args,1)
  20.    n     = subwrd(args,2)
  21.    frame = subwrd(args,3)

  22. *  find coordinates for this frame
  23. *  -------------------------------
  24.    ii = 0
  25.     k = 0
  26.    while ( ii < m )
  27.       ii = ii + 1
  28.       jj = 0
  29.       while ( jj < n )
  30.           jj = jj + 1
  31.           k = k + 1
  32.           if ( k = frame )
  33.                i = ii
  34.                j = jj
  35.                break
  36.           endif
  37.       endwhile
  38.    endwhile

  39. * Determine page size
  40. * -------------------
  41.   'q gxinfo'
  42.   line = sublin(result,2)
  43.   xsize = subwrd(line,4)
  44.   ysize = subwrd(line,6)

  45.   say xsize ' ' ysize

  46. * Determine xy in page coordinates
  47. * --------------------------------
  48.   dx = (xsize-2) / n
  49.   dy = (ysize-1.5) / m

  50.   xoff = 0.125 * dx
  51.   yoff = 0.125 * dy

  52.   dy = dy - yoff/4

  53.   xa = (j-1) * dx + xoff + 0.5
  54.   xb = xa + dx -  xoff
  55.   ya = (m-i) * dy + yoff + 1
  56.   yb = ya + dy - yoff
  57. *我改动了dx dy xa ya 留出了画色标的地方
  58. *  Note :
  59. *        dx dy xa xb ya yb could be modified according to your own prefrence.

  60.   say 'set parea ' xa ' ' xb ' ' ya ' ' yb
  61.   'set parea ' xa ' ' xb ' ' ya ' ' yb
  62. *加入了下面几行,设置xlab ylab在整个图最外侧标
  63.   if (i < m)
  64.     'set xlab off'
  65.   else
  66.     'set xlab on'
  67.   endif
  68.   
  69.   if( j = 1 )
  70.     'set ylab on'
  71.   else
  72.     'set ylab off'
  73.   endif
  74.   

  75. return
复制代码

subplot_test1.jpg subplot_test_shaded.jpg


  1. 'reinit'
  2. 'open D:\Summer\F\NCEP-DOE-R2\vwnd\vwnd.year.ctl'
  3. 'enable print D:\Summer\F\NCEP-DOE-R2\subplot_test2.gmf'


  4. 'set grid off'
  5. 'set lon 0 360'
  6. 'set lat 0 90'
  7. 'set z 10'
  8. 'set map 1'
  9. 'set mproj scaled'
  10. 'set ylopts 1 5 0.15'
  11. 'set xlopts 1 5 0.15'
  12. 'set annot 1 5'

  13. fig = abcdefghijklmn

  14. i=1
  15. while(i<=8)
  16. 'set vpage 0 11 0 8.5'
  17. 'set grads off'
  18. 'subplot_y 4 2 'i''
  19. 'set t 'i''
  20. 'set ylint 20'
  21. 'set xlint 60'

  22. 'set gxout shaded'
  23. 'color_16_BlDarkRe'
  24. 'set rbcols 17 18 19 20 21 22 23 24 0 255 25 26 27 28 29 30 31 32'
  25. 'set clevs -40 -35 -30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40'
  26. 'd vwnd'

  27. * 'set gxout contour'
  28. * 'set clevs -40 -35 -30 -25 -20 -15 -10 -5 5 10 15 20 25 30 35 40'
  29. * 'd vwnd'

  30. * 'draw_figstr2 TL 1.0 Fig.'i''
  31. figi=substr(fig,i,1)
  32. 'draw_figstr2 TL 1.0 ('figi')'
  33. i=i+1
  34. endwhile
  35. 'cbar_matlab 2 1 0  5.20 0.5'
  36. 'print'
  37. 'disable print'
  38. ;
复制代码



另外,在我的画图脚本里用到了@兰溪之水 的drawfigstr, 也根据自己的需要进行了修改。
http://bbs.06climate.com/forum.php?mod=viewthread&tid=15203
修改后可以在BL/BR/TR/TL标记长度不大于10的字符串,字符串外的框会随字符串长度调整。
但限于个人水平,修改之后使用比较受限,


兰溪原版使用如下:
*    1. drawfigstr BottomLeft (a)
*    2. drawfigstr TL (b)
*    3. drawfigstr BR (c) 1.5
修改后只能按照下面的格式
*    1. 'draw_figstr2 BL 1.0 (a)'
*    2. 'draw_figstr2 TL 1.2 (b)'
*    3. 'draw_figstr2 BR 1.5 phase 1'
BL/BR/TR/TL 不能再写全名,只能简写,放大因子必须保留一位小数,所标字符串需要与撇号紧挨,不然图上标记时字符后会有空白。
所用函数一并打包放附件。
附件.zip (1.31 MB, 下载次数: 91)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-26 17:47:38 | 显示全部楼层
楼主,这个很不错,有时间学习下!
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

新浪微博达人勋

发表于 2017-9-26 18:35:17 | 显示全部楼层
好棒啊,图很漂亮。感谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-26 20:25:39 来自手机 | 显示全部楼层
学习学习~感谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-27 06:58:16 | 显示全部楼层
很不错,感谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-9 22:48:37 | 显示全部楼层
厉害呀楼主,画出来的图也很漂亮!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-11 12:23:35 | 显示全部楼层
grads图也很好看了,有些像ncl出来的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-4 11:04:19 | 显示全部楼层
thank u very much!
have a try~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-1-8 09:22:53 | 显示全部楼层
楼主厉害了,学习学习
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-1-8 11:32:43 | 显示全部楼层
楼主,cbar_matlab这个函数怎么获取?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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