Python-cartopy兰伯特投影绘制场图

news/2024/11/25 16:46:38/

在学习画图的过程中,看了许多大佬的绘图代码收益匪浅。在巨人的肩膀上继续前进,分享这一次的画图。多数没有注释,原理可能需要额外找别的帖子进行查阅。

再次之前,anaconda安装cartopy包也遇到了不少困难,我的解决方案是:装好对应Python版本的四个包:pyshp, Pillow, pyproj, Shapely。另外安装xarray的时候记得安装netcdf4。对应的安装网站在评论区进行分享。

本次画图笔记分成三个部分:

1.文件读取(采用的是WRF输出的wrfout文件)。

2.利用cartopy-读取shp文件,在前面几篇大佬的基础上动用掩模,以及投影兰伯特投影。这里用的是封装函数,我直接写在总代码里。

3.绘制场图,在colorbar上分成几种不同的形式。


读取包

import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from cartopy.io.shapereader import Reader
import cartopy.feature as cfeat
import shapefile
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import matplotlib.pyplot as plt
import xarray as xr
import numpy as np

第一步:读取nc文件,这里有的人用netcdf4的库,我这里用的是xarray的库。大同小异,只要能读到nc文件的变量都ok。

ncfile =''  #你的nc文件路径
lon = ncfile['XLAT'].data[0,:,:]   #这里时间纬度只有1维 所以第一个是0,后面是全部遍历
lat = ncfile['XLONG'].data[0,:,:] 
T2  = ncfile['T2'].data[0,:,:]-273.15  #这里选取了2米温度作为变量,时间为第一个

第二步:(1)掩膜,这里是根据气象家园的大佬写的代码,具体链接内容我在评论区提供:

def shp2clip (fig_cf, axes, shpfile, regionlist, pro=None):'''该函数用于对contourf进行掩模处理---关键词-------------------fig_cf     :    这里指的是contourf对应的对象(不知道这样的表述是不是准确的)axes       :    画图用的axes轴shpfile    :    输入shp文件regionlist :    shp文件中特定的代码,在arcmap或者是python中可以直接看到想要掩模目标的地区编号pro        :    画图对应的投影系统'''sf = shapefile.Reader(shpfile, encoding='gbk')vertices = []codes = []for shape_rec in sf.shapeRecords():region_name = shape_rec.record[1]         if region_name in regionlist: pts = shape_rec.shape.pointsprt = list(shape_rec.shape.parts) + [len(pts)]for i in range(len(prt) - 1):for j in range(prt[i], prt[i+1]):if proj:vertices.append(proj.transform_point(pts[j][0], pts[j][1], ccrs.Geodetic()))else:vertices.append((pts[j][0], pts[j][1]))codes += [Path.MOVETO]codes += [Path.LINETO] * (prt[i+1] - prt[i] -2)codes += [Path.CLOSEPOLY]clip = Path(vertices, codes)clip = PathPatch(clip, transform=axes.transData)for contour in originfig.collections:contour.set_clip_path(clip)return clip

第二步:(2)兰伯特投影刻度,有画兰伯特需求的朋友都知道,cartopy给的兰伯特投影刻度有时候比较尴尬,虽然是对的,但是为了美观才有了大佬们写的兰伯特的刻度定义函数代码:

def find_x_intersections(axes, xticks):xmin, xmax, ymin, ymax = axes.get_extent()lonmin, lonmax, latmin, latmax = axes.get_extent(ccrs.PlateCarree())xaxis = sgeom.LineString([(xmin, ymin), (xmax, ymin)])lon_ticks = [tick for tick in xticks if tick >= lonmin and tick <= lonmax]nstep = 50 xlocs= []xticklabels = []for tick in lon_ticks:lon_line = sgeom.LineString(axes.projection.transform_points(ccrs.Geodetic(),np.full(nstep, tick),np.linspace(latmin, latmax, nstep))[:,:2])if xaxis.intersection(lon_line):point = xaxis.intersection(lon_line)xlocs.append(point.x)xticklabels.append(tick)else:continueformatter = LongitudeFormatter()xticklabels = [formatter(label) for label in xticklabels]return xlocs, xticklabelsdef find_y_intersections(axes, yticks):xmin, xmax, ymin, ymax = axes.get_extent()lonmin, lonmax, latmin, latmax = axes.get_extent(ccrs.PlateCarree())yaxis = sgeom.LineString([(xmin, ymin), (xmin, ymax)])lat_ticks = [tick for tick in yticks if tick >= latmin and tick <= latmax]nstep = 50ylocs = []yticklabels = []for tick in lat_ticks:lat_line = sgeom.LineString(axes.projection.transform_points(ccrs.Geodetic(),np.linspace(lonmin, lonmax, nstep),np.full(nstep, tick))[:,:2])if yaxis.intersects(lat_line):point = yaxis.intersection(lat_line)ylocs.append(point.y)yticklabels.append(tick)else:continueformatter = LatitudeFormatter()yticklabels = [formatter(label) for label in yticklabels]return ylocs, yticklabelsdef set_lambert_ticks(axes, xticks, yticks):xlocs, xticklabels = find_x_intersections(axes, xticks)axes.set_xticks(xlocs)axes.set_xticklabels(xticklabels)# 设置y轴.ylocs, yticklabels = find_y_intersections(axes, yticks)axes.set_yticks(ylocs)axes.set_yticklabels(yticklabels)

兰伯特投影的函数有很多,这里只是用一种我能运行成功的方法。欢迎后续的交流。

第三步:画图部分:

plt.rcParams['figure.dpi']       = 1000
plt.rcParams['font.sans-serif']  = ['Times New Roman']map_proj = ccrs.LambertConformal(central_longitude=114, standard_parallels=(25,47))
shp_city      = r'' #你的shp文件路径
read_city      = Reader(shp_city)
city  = cfeat.ShapelyFeature(read_city.geometries(), ccrs.PlateCarree(), edgecolor='k', facecolor='None',linewidth=0.9)fig,axes = plt.subplots(1,1,subplot_kw={'projection':map_proj})
cf=axes.contourf(lon,lat,T2,transform=ccrs.PlateCarree())#画场图的代码
extent=[108, 119, 20, 26] #经纬度范围。
axes.set_extent(extent, crs=ccrs.PlateCarree())
axes.add_feature(city)shp2clip(cf, axes,'你的shp文件文件路径',["你的shp文件对应编号”],proj=map_proj)  #调用前面写好的函数
fig.canvas.draw() xticks = list(range(108, 119, 2))#设置刻度
yticks = list(range(20, 26, 1))axes.gridlines(xlocs=xticks, ylocs=yticks, linewidth=1.2, linestyle='--')
set_lambert_ticks(axes, xticks, yticks) #调用前面写好的函数

如图所示,我选择了广东省为我的目标,那么我需要在shp文件中找到对应的编码。因为我的区域编号在第二行,所以这里的region_name 旁边的数字应该改为1,以此类推。

 

 在下一章,我将继续分享colorbar不同的画法。以上是我从各位大佬的帖子中学到的代码,作为一个分享。欢迎交流


http://www.ppmy.cn/news/964956.html

相关文章

【Python气象处理绘图第七弹–泰勒图绘制】

Python气象处理绘图第七弹–泰勒图绘制 泰勒图绘制 Python气象处理绘图第七弹–泰勒图绘制前言一、数据预处理二、使用步骤1.引入库2.读入数据 总结 前言 在进行模式评估的过程中&#xff0c;常常需要评估模式的模拟性能&#xff0c;这通常由空间相关系数&#xff08;CC&#…

ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了!

来源&#xff1a;机器之心 作者&#xff1a;符尧、彭昊、Tushar Khot、郭志江等 符尧&#xff08;yao.fued.ac.uk&#xff09;&#xff0c;爱丁堡大学 (University of Edinburgh) 博士生&#xff0c;本科毕业于北京大学。他与彭昊、Tushar Khot在艾伦人工智能研究院 (Allen Ins…

从科幻阅读到科幻写作,中国首位科幻博士一文讲清楚|附全年龄段书单

演讲/姜振宇 整理/正峰哥 导读姜振宇&#xff0c;中国第一位科幻文学博士&#xff0c;现就职于四川大学文学与新闻学院中国科幻研究院&#xff0c;兼任南方科技大学科学与人类想象力中心客座研究员&#xff0c;全球华语科幻星云奖专业评委。423世界读书日&#xff0c;我们邀…

什么是科幻小说

正所谓‘名不正则言不顺&#xff0c;言不顺则事不成’。所以在没有弄清什么是科幻小说之前&#xff0c;期盼科幻小说的繁荣是不切实际的。在讲究‘名分’的中国尤其是这样&#xff01;惨痛的教训就是上世纪八十年代&#xff0c;正当中国原创科幻蓄势待发、如火如荼&#xff0c;…

这11位作家,要用AI写科幻小说了

郭一璞 发自 创新工场 量子位 报道 | 公众号 QbitAI AI辅助创作在2020年不是新鲜事&#xff0c;但在对艺术性、逻辑性要求都不低的文学创作领域&#xff0c;行得通么&#xff1f; 有人决定试一试&#xff0c;让AI来辅助人类&#xff0c;写科幻小说。 「AI」的一方是一个名叫「A…

爆火的ChatGPT是什么?一帧秒创AI作画生-优漫动游

12月1日&#xff0c;这一语言模型正式对公众开放。仅用了5天时间&#xff0c;其用户就突破了100万人。ChatGPT的强大能力&#xff0c;让体验者惊叹“人类要被抢饭碗了”“AI成精了”&#xff0c;且不断吸引着世界各地的用户持续探索它的能力和边界。 9月初开始盛行的AI作画风头…

Maven详细安装教程

IDEA配置maven详情参考以下博主 Maven详细安装教程_maven安装_慕之寒的博客-CSDN博客

idfa码如何查看_小E告诉你:如何快速登录和高效使用华为电子邮件

互联网信息时代 每个人都拥有多个邮箱账号进行邮件通讯 但是那么多个邮箱地址 如何实现高效管理&#xff1f; 当然是使用华为电子邮件啦&#xff01; 华为电子邮件&#xff0c; 帮助你在手机上简洁高效地管理各类邮箱 还能快捷地管理用户邮箱&#xff0c;收发邮件&#xff0c; …