爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7040|回复: 8

MeteoInfoLab脚本示例:图形版面、点标注

[复制链接]

新浪微博达人勋

发表于 2015-10-11 15:03:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2018-12-19 23:06 编辑

在MeteoInfoLab界面中,图形的大小会随着它所在的窗口的大小改变而改变,在需要精确控制图中一些要素的位置的时候会比较困难,这时可以用figure函数的一些参数来控制图形版面大小。figure函数是创建一个新的图形窗体,其中的参数figsize=None,即缺省情况下图形窗体中的图形不指定大小,而是由窗体的大小决定。通过给figsize赋值为一个有2个元素的列表(第一元素为宽度、第二个元素为高度,单位为像素),即可以固定图形版面(绘图区域大小不随窗口变化而变化)。注意给定版本大小后在保存图片的语句中savefig就不要给高、宽值了。
之前的帖子讲到了可以在geoshow函数中设置labelfield等参数来给点图层添加标注(比如城市名,http://bbs.06climate.com/forum.p ... 6418&extra=page%3D1),但这种自动标注经常不符合绘图要求,比如我们需要标注出所有省会城市的名称,且不能出现压盖情况,首先在geoshow函数中设置avoidcoll=False,把自动避免压盖的功能去掉,这样就可以显示所有的城市名,但会有压盖现象,我们可以通过图层的movelabel(label, x=0, y=0)来移动标注,label为某个城市的名称(注意中文名称之前需要加u表示为unicode编码,比如:u'北京'),x和y是移动的值。


这里用一个比较实用的例子来说明,绘制中国6小时降水分布图,给定图形版面大小,并标注所有省会城市名:
  1. #Set data foldersbasedir = 'D:/MyProgram/Distribution/java/MeteoInfo/MeteoInfo'
  2. datadir = os.path.join(basedir, 'sample/MICAPS')

  3. #Read station data
  4. f = addfile_micaps(os.path.join(datadir, '10101414.000'))
  5. pr = f['Precipitation6h'][:]
  6. lon = f['Longitude'][:]
  7. lat = f['Latitude'][:]

  8. #griddata function - interpolate
  9. x = arange(75, 135, 0.5)
  10. y = arange(18, 55, 0.5)
  11. prg = griddata((lon, lat), pr, xi=(x,y), method='idw',radius=3)[0]

  12. #Plot
  13. figure(figsize=[700,550], newfig=False)
  14. proj = projinfo(proj='lcc', lon_0=105, lat_1=25, lat_2=47)
  15. axesm(projinfo=proj, position=[0.01, 0.01, 0.99, 0.99], axison=False, gridlabel=False, frameon=False)
  16. geoshow('cn_province', edgecolor='lightgray')
  17. bou1_layer = geoshow('cn_border', facecolor=(0,0,255))
  18. city_layer = geoshow('cn_cities', facecolor='r', size=4, labelfield='NAME', fontname=u'楷体', fontsize=16, yoffset=15, avoidcoll=False)
  19. china_layer = geoshow('china', visible=False)
  20. city_layer.movelabel(u'西宁', -15)
  21. city_layer.movelabel(u'海口', -20, -10)
  22. city_layer.movelabel(u'澳门', 0, -25)
  23. city_layer.movelabel(u'香港', 20, -10)
  24. city_layer.movelabel(u'福州', -10)
  25. city_layer.movelabel(u'合肥', -18)
  26. city_layer.movelabel(u'杭州', 0, -20)
  27. city_layer.movelabel(u'上海', 18)
  28. city_layer.movelabel(u'太原', 0, -20)
  29. city_layer.movelabel(u'天津', 15)
  30. city_layer.movelabel(u'石家庄', -10)
  31. levs = [0.1, 1, 2, 5, 10, 20, 25, 50, 100]
  32. cols = [(255,255,255),(170,240,255),(120,230,240),(200,220,50),(240,220,20),(255,120,10),(255,90,10), \
  33.     (240,40,0),(180,10,0),(120,10,0)]
  34. layer = contourfm(x, y, prg, levs, colors=cols)
  35. masklayer(china_layer, [layer])
  36. #colorbar(layer, shrink=0.5, aspect=15)
  37. legend(legend=layer.legend(), loc='lower left', frameon=True, \
  38.     title=u'降雨量(mm)', titlefontname=u'黑体')
  39. axism([79, 128, 14, 53])
  40. text(95, 53, u'全国降水量实况图', fontname=u'黑体', fontsize=18)
  41. text(95, 51, u'(2010-10-14 08:00 至 2010-10-14 14:00)', fontname=u'黑体', fontsize=16)
  42. #Add south China Sea
  43. sc_layer = bou1_layer.clone()
  44. axesm(position=[0.15,0.05,0.15,0.2], axison=False, frameon=True)
  45. geoshow(sc_layer, facecolor=(0,0,255))
  46. xlim(106, 123)
  47. ylim(2, 23)
  48. #savefig('D:/Temp/test/rain_test.png')


Image00185.png


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

新浪微博达人勋

发表于 2015-10-11 19:55:12 | 显示全部楼层
终于有这样的实用功能了,方便自动出图。感谢王老师。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-29 14:55:11 | 显示全部楼层
楼主,我想请问此软件是不是colorbar和legend不能同时显示?比如contour和站点都需要色标
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-12-19 20:47:22 | 显示全部楼层
王老师,我用的1.7版本,只改了路径剩下用的都是自带的数据,运行脚本出错如下:
  1. Traceback (most recent call last):
  2.   File "/data/c03n02/cliu/data/micaps/test.py", line 38, in <module>
  3.     layer = contourfm(prg, levs, colors=cols)
  4.   File "/data/c03n02/cliu/software/meteinfo/MeteoInfo-1.7a1/MeteoInfo/pylib/mipylib/plotlib/miplot.py", line 2290, in contourfm
  5.     r = gca.contourf(*args, **kwargs)
  6.   File "/data/c03n02/cliu/software/meteinfo/MeteoInfo-1.7a1/MeteoInfo/pylib/mipylib/plotlib/mapaxes.py", line 880, in contourf
  7.     y = a.dimvalue(0)
  8. AttributeError: <b>PyGridData instance has no attribute 'dimvalue'</b>
复制代码

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

新浪微博达人勋

 楼主| 发表于 2018-12-19 23:06:49 | 显示全部楼层
chongzika 发表于 2018-12-19 20:47
王老师,我用的1.7版本,只改了路径剩下用的都是自带的数据,运行脚本出错如下:

之前的脚本程序过时了,已经在1楼更新了脚本程序。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-12-21 14:13:26 | 显示全部楼层
MeteoInfo 发表于 2018-12-19 23:06
之前的脚本程序过时了,已经在1楼更新了脚本程序。

可以了,多谢王老师。另外问一下这些中文的站点名怎么改成英文拼音
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-10-12 14:27:00 | 显示全部楼层
王老师好,请问一下是我的版本太旧了吗,用text时经常报错AttributeError: 'NoneType' object has no attribute 'axes'
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-10-12 15:40:44 | 显示全部楼层
wujiaqi 发表于 2019-10-12 14:27
王老师好,请问一下是我的版本太旧了吗,用text时经常报错AttributeError: 'NoneType' object has no attri ...

建议用最新版本。text 函数并不会自动创建坐标系(Axes),如果之前的语句没有创建坐标系就会报错。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-10-13 11:36:03 | 显示全部楼层
MeteoInfo 发表于 2019-10-12 15:40
建议用最新版本。text 函数并不会自动创建坐标系(Axes),如果之前的语句没有创建坐标系就会报错。

好的,谢谢王老师
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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