爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 35318|回复: 22

[经验总结] 更新:已解决,改为经验,CartoPy画色斑图的时候无法同时显示地图和数据

[复制链接]

新浪微博达人勋

发表于 2018-7-7 21:36:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 QCD 于 2018-7-7 22:28 编辑

更新:借助Google找到了解决方法
StackOverFlow上已经有人提过类似的问题(https://stackoverflow.com/questions/45042722/cartopy-matplotlib-contourf-map-overriding-data),是由于两幅图都是同一个类型,使用的zorder是相同的,所以需要手动制定zorder,可以参考matplotlib关于zorder的demo(https://matplotlib.org/examples/pylab_examples/zorder_demo.html)
ax.add_feature(adm2_shapes,zorder=1)
axis = ax.contourf(olon,olat,rain_data_new, levels=levels, cmap='viridis',transform=ccrs.PlateCarree(),zorder=5)

最终结果

test-cartopy_3.png




最近在学习使用Python进行色斑图,在学习了论坛里多位大神的经验后(如非对称的帖子1和他在Github上的MicapsDraw;平流层的萝卜的maskout方法,也参考过chiqu296的code)成功使用Basemap画出的想要的图。
test_basemap.png

但是考虑到Basemap势必逐渐被CartoPy取代,MetPy和Iris等的例子里面也多使用CartoPy,因此决定尝试CartoPy,在学习了po_po1的方法后实现了成功剪切,如

test-cartopy_0.png

但是随后在叠加地图的时候遇到了麻烦,如果使用ax.add_feature来加入用于裁剪的shp文件,就会发生只有地图而没有色斑图的现象,如下图所示

test-cartopy_1.png

最后发现如果将读入的地图数据的alpha值降低后就可以将2者都显示出来,但是色斑图也被叠加了alpha值处理,如下图所示

test-cartopy_2.png


不知道社区的大神们有没有遇到过类似的问题,或者有没有其他使用cartopy来画色斑图的成功经验?谢谢!


附上使用的代码:

  1. import numpy as np
  2. from scipy.interpolate import Rbf
  3. import pandas as pd

  4. import matplotlib.pyplot as plt
  5. from matplotlib.pyplot import colormaps as cmap

  6. import cartopy.crs as ccrs
  7. import cartopy.feature as cfeat

  8. from cartopy.io.shapereader import Reader
  9. from cartopy.feature import ShapelyFeature
  10. from cartopy.mpl.patch import geos_to_path

  11. from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
复制代码
  1. <font face="微软雅黑">data = pd.read_csv('../rain05.csv')

  2. # 插值
  3. lon = data['Lon']
  4. lat = data['Lat']
  5. rain_data = data['PRE_Time_0808']

  6. # [103,110,24.5,29.3]
  7. olon = np.linspace(103,110,88)
  8. olat = np.linspace(24.5,29.3,88)
  9. olon,olat = np.meshgrid(olon,olat)
  10. # 插值处理
  11. func = Rbf(lon, lat, rain_data,function='linear')
  12. rain_data_new = func(olon, olat)



  13. levels = [0,10,25,50,100,150,200,300,450]


  14. fname = '../Micaps-shapefiles/Province.shp'
  15. fname2 = '../Micaps-shapefiles/Province.shp'
  16. adm1_shapes = ShapelyFeature(Reader(fname).geometries(),ccrs.PlateCarree(), facecolor='White',edgecolor='black')

  17. adm2_shapes = ShapelyFeature(Reader(fname2).geometries(),ccrs.PlateCarree(),facecolor='White',edgecolor='black',alpha=0.1,linewidth=2)


  18. #设定裁剪区域
  19. reader = Reader(fname)
  20. provinces = reader.records()


  21. #Micaps地图中Province.shp中可以使用PAC区分不同省份,同理City.shp和County.shp也可使用该关键字
  22. us_multipoly, = [province.geometry for province in provinces if province.attributes['PAC'] == 520000]
  23. main_us_geom = sorted(us_multipoly.geoms, key=lambda geom: geom.area)[0]
  24. us_path, = geos_to_path(main_us_geom)

  25. #画图部分
  26. fig = plt.figure(figsize=(12,9))

  27. ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
  28. plate_carre_data_transform = ccrs.PlateCarree()._as_mpl_transform(ax)

  29. axis = ax.contourf(olon,olat,rain_data_new, levels=levels, cmap='viridis',transform=ccrs.PlateCarree(),zorder=5)

  30. for collection in axis.collections:
  31.     collection.set_clip_path(us_path, plate_carre_data_transform)#设置显示区域


  32. ax.add_feature(adm2_shapes,zorder=1)

  33. # ax.set_extent([103,110,24.5,29.3])</font>
复制代码




点评

腻害  发表于 2018-7-18 20:22
腻害  发表于 2018-7-18 20:22
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-10-17 17:04:13 | 显示全部楼层
QCD 发表于 2018-7-12 10:33
地图的问题已经解决了,一个是制定zorder,另一个是加上alpha=1,我没搞懂后面这种为什么也可以起作用

请教下楼主zorder的作用是什么?为什么设置为1和5呢?
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2018-7-7 21:37:54 | 显示全部楼层
不好意思,代码里漏掉了一部分
  1. import numpy as np
  2. from scipy.interpolate import Rbf
  3. import pandas as pd

  4. import matplotlib.pyplot as plt
  5. from matplotlib.pyplot import colormaps as cmap

  6. import cartopy.crs as ccrs
  7. import cartopy.feature as cfeat

  8. from cartopy.io.shapereader import Reader
  9. from cartopy.feature import ShapelyFeature
  10. from cartopy.mpl.patch import geos_to_path

  11. from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-7 23:27:40 来自手机 | 显示全部楼层
你好贵州的同事,我最近也在画色板图
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-8 00:05:28 | 显示全部楼层
我想了解插值,线性插值不通用
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-8 13:55:20 | 显示全部楼层
⑨P_bō 发表于 2018-7-7 23:27
你好贵州的同事,我最近也在画色板图

卫星遥感的同事?看ID似乎能关联到名字?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-10 10:25:09 | 显示全部楼层
QCD 发表于 2018-7-8 13:55
卫星遥感的同事?看ID似乎能关联到名字?

哈哈,是的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-10 10:25:30 | 显示全部楼层
QCD 发表于 2018-7-8 13:55
卫星遥感的同事?看ID似乎能关联到名字?

哈哈,是的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-11 23:15:29 | 显示全部楼层
楼主现在的代码是已经解决了问题的么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-12 10:33:02 | 显示全部楼层
chongzika 发表于 2018-7-11 23:15
楼主现在的代码是已经解决了问题的么?

地图的问题已经解决了,一个是制定zorder,另一个是加上alpha=1,我没搞懂后面这种为什么也可以起作用
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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