Python可视化| 图形白化:气象绘图必备

图形白化实际上就是利用界线文件,来将某目标区域以外进行遮挡的操作,这样可以使我们只关注目标区域的变量分布。之所以把这个内容也归为图层关系这里来,是因为它的本质也是对图层的操作。

我们实现图形白化,基本上都是用 shp 文件来操作的。而读取 shp 文件的方法,我推荐大家选择使用 geopandas。从这个库的名字就可以看出,它与 pandas 有一定的联系,事实也的确如此:这个库的使用习惯于 Pandas 十分相似,因此可以很大程度上减轻大家的负担。

import geopandas as gpd  # 用于读取shp文件

我们通过一个 read_file 函数就可以实现对 shp 文件的读取,当然这个函数支持的文件格式不止 shp,类似 shx、dbf 等格式文件也是同样支持的。此外这个函数还有一个重要参数,就是 encoding,是用来指定所读取文件的编码方式的,比如这里我提供的文件编码方式为"gbk"。此外常见的编码方式还有"utf8"。

并且索引到地区

shp = gpd.read_file(
    '/home/mw/input/moyu4302/dijishi_2004.shp',
    encoding='gbk')  # 读取shp文件
shp['geometry'][shp['NAME2004'] == '大兴安岭地区']  # 索引出大兴安岭地区的geometry数据
import geopandas as gpd  # 用于读取shp文件
import numpy as np
import cartopy.crs as ccrs  # 调用cartopy投影模块
import cartopy.feature as cfeature  # 调用cartopy地理特征模块
import matplotlib.pyplot as plt  # 调用基础绘图函数
import cartopy.mpl.ticker as cticker  # 调用cartopy处理坐标刻度模块
shp = gpd.read_file(
    '/home/mw/input/moyu4302/dijishi_2004.shp',
    encoding='gbk')  # 读取shp文件
shp
shp['geometry'][shp['NAME2004'] == '大兴安岭地区']  # 索引出大兴安岭地区的geometry数据
# 创建一些随机数据用于填色
lon = np.arange(60, 151, 1)  # 生成经度数组
lat = np.arange(0, 61, 0.1)  # 生成纬度数组
lon_grid, lats_grid = np.meshgrid(lon, lat)  # 将经纬度数组组合成网格
data = (lon_grid-60)**2 + (lats_grid-0)**2  # 生成经纬度网格形状的随机数据
# 创建底图
fig = plt.figure(figsize=(15, 15))  # 创建figure对象
ax1 = fig.add_axes([0.1, 0.1, 0.3, 0.3], projection=ccrs.PlateCarree())  # 创建子图
# 设置图形范围
leftlon, rightlon, lowerlat, upperlat = (60, 150, 0, 60)
img_extent = [leftlon, rightlon, lowerlat, upperlat]
ax1.set_extent(img_extent, crs=ccrs.PlateCarree())
ax1.set_xticks(np.arange(leftlon, rightlon+30, 30),
               crs=ccrs.PlateCarree())  # 设置x轴刻度
ax1.set_yticks(np.arange(lowerlat, upperlat+30, 30),
               crs=ccrs.PlateCarree())  # 设置y轴刻度
ax1.xaxis.set_major_formatter(cticker.LongitudeFormatter())  # 设置x轴刻度为经度格式
ax1.yaxis.set_major_formatter(cticker.LatitudeFormatter())  # 设置y轴刻度为纬度格式
ax1.add_feature(cfeature.COASTLINE, zorder=1)  # 绘制海岸线
cf = ax1.contourf(
    lon,
    lat,
    data,
    transform=ccrs.PlateCarree(),
    zorder=0);  # 绘制填色图
# 生成Path和进行裁剪所需要的的模块
from matplotlib.path import Path
from cartopy.mpl.patch import geos_to_path
# 创建一些随机数据用于填色
lon = np.arange(60, 151, 1)
lat = np.arange(0, 61, 0.1)
lon_grid, lats_grid = np.meshgrid(lon, lat)
data = (lon_grid-60)**2 + (lats_grid-0)**2
# 创建底图
fig = plt.figure(figsize=(15, 15))
ax1 = fig.add_axes([0.1, 0.1, 0.3, 0.3], projection=ccrs.PlateCarree())
leftlon, rightlon, lowerlat, upperlat = (60, 150, 0, 60)
img_extent = [leftlon, rightlon, lowerlat, upperlat]
ax1.set_extent(img_extent, crs=ccrs.PlateCarree())
ax1.set_xticks(np.arange(leftlon, rightlon+30, 30), crs=ccrs.PlateCarree())
ax1.set_yticks(np.arange(lowerlat, upperlat+30, 30), crs=ccrs.PlateCarree())
ax1.xaxis.set_major_formatter(cticker.LongitudeFormatter())
ax1.yaxis.set_major_formatter(cticker.LatitudeFormatter())
ax1.add_feature(cfeature.COASTLINE.with_scale('50m'), zorder=1)
cf = ax1.contourf(lon, lat, data, transform=ccrs.PlateCarree(), zorder=0)
# 读取shp文件
shp = gpd.read_file('/home/mw/input/moyu4302/dijishi_2004.shp', encoding='gbk')
a = shp['geometry'][(shp['NAME2004']=='大兴安岭地区')|(shp['NAME2004']=='黑河市')]
# 生成裁剪路径 – 关键操作1
path_clip = Path.make_compound_path(*geos_to_path(a.to_list()))
# 将裁剪路径应用到图层 – 关键操作2
[collection.set_clip_path(path_clip, transform=ax1.transData)
 for collection in cf.collections]
# 绘制多边形边缘线
ax1.add_geometries(
    a,
    crs=ccrs.PlateCarree(),
    facecolor='none',
    edgecolor='black');

我们就能获得白化之后的图像。

转载链接:https://www.heywhale.com/home/competition/62c29fed0123ec8270e8a7b9/submit

 超友好!气象 Python 训练营 ⑥ 绘图详解|第四关

感谢和鲸鱼 感谢各位版主为气象可视化的Python做出的努力!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值