爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 23954|回复: 5

[经验总结] Cartopy绘制极射赤面投影

[复制链接]

新浪微博达人勋

发表于 2019-10-30 14:21:53 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wxj96 于 2019-10-31 10:55 编辑

最近需要画北半球的图,基于Python的Cartopy地图库,画北半球极射赤面投影。找了很多都没有相关的经验分享,准备自己写一个。


用到cartopy库的两个坐标函数,Orthographic和PlateCarreeOrthographic用于画底图,PlateCarree表示数据本身的投影方法。几乎所有的气象数据都是格点或者站点数据,基本都符合PlateCarree坐标。开始以为transform表示转化到某个投影,其实transform表示数据本身符合哪种投影,转化到地图投影上。


具体代码如下
  1. import matplotlib.pyplot as plt
  2. import matplotlib as mpl
  3. import cartopy.crs as ccrs
  4. import cartopy.feature as cfeature
  5. from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
  6. from netCDF4 import Dataset
  7. import numpy as np

  8. def make_map(ax):
  9.     projection = ccrs.Orthographic(central_longitude=-90,central_latitude=90)
  10.     ax.set_global()
  11.     ax.coastlines(linewidth=0.5)
  12.     '''标注坐标轴'''
  13.     # ax.set_xticks(np.linspace(-180, 180, 1), crs=projection)
  14.     # ax.set_yticks(np.linspace(-90, 90,5), crs=projection)
  15.     '''zero_direction_label=True 有度的标识,False则去掉'''
  16.     lon_formatter = LongitudeFormatter(zero_direction_label=True)
  17.     lat_formatter = LatitudeFormatter()
  18.     # ax.xaxis.set_major_formatter(lon_formatter)
  19.     # ax.yaxis.set_major_formatter(lat_formatter)
  20.     '''添加网格线'''
  21.     #gl = ax.gridlines()
  22.     #ax.grid()
  23.     return ax


  24. data = Dataset('hgt500_correlation_mon_mean.nc')
  25. hgt = data.variables['correlation'][:,:,:,:]
  26. lat = data.variables['lat'][:]
  27. lon = data.variables['lon'][:]
  28. data_proj = ccrs.PlateCarree(central_longitude=0)
  29. fig = plt.figure()
  30. proj = ccrs.Orthographic(central_longitude=-90,central_latitude=90)
  31. ax = fig.add_subplot(projection = proj)
  32. ax = make_map(ax)
  33. ax.gridlines(color='gray', linestyle='--', xlocs = np.arange(0,390,20), ylocs = np.linspace(-80,80,9))
  34. cf = ax.contour(lon, lat, hgt[0,0,:,:], colors='k',transform=data_proj)
  35. plt.clabel(cf,fmt = '%5.2f')
  36. plt.show()

复制代码



评分

参与人数 2金钱 +20 贡献 +2 收起 理由
little卓忘密码 + 10 赞一个!
mofangbao + 10 + 2

查看全部评分

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

新浪微博达人勋

发表于 2021-3-30 19:50:44 | 显示全部楼层
{:5_213:}{:5_213:}{:5_213:}{:5_213:}{:5_213:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-30 20:13:37 | 显示全部楼层
真的太牛逼了!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-8-22 17:15:49 | 显示全部楼层
博主您好,如果不画整个北半球,只画纬度为40-90的,经度为0-360的地图可以怎么修改代码吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-9-15 15:28:33 | 显示全部楼层
易烊启迪 发表于 2022-8-22 17:15
博主您好,如果不画整个北半球,只画纬度为40-90的,经度为0-360的地图可以怎么修改代码吗?

xlim和ylim用于选择绘图范围
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-5-31 17:19:42 | 显示全部楼层
很好,就是正面中心是北美洲,改成正面是110E或120E才是需要的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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