编程学习网 > 编程语言 > Python > Python气象绘图:画中画教程
2023
10-12

Python气象绘图:画中画教程

气象绘图中常遇到需要画中画显示的情景,多见于地图显示(如下图,已隐去经纬度细节),由于边缘几个站点远离画面主体,直接平铺直叙地将所有站点绘于一张画布,会导致要素在图片内过于分散,不便于用户快速获取重要气象信息。


plt或者axes默认的多个子图通常按行列排列且不重叠(如下图),与我们所需的画中画不符。


绘制地图的多个子图不适用默认的

fig, ax = plt.subplots(n,n)等方式。

经过查找,最适合地图的多子图模式是画中画,将边缘几个站点绘于子图。一般子图位于主图四个边角范围。由于地图显示的特殊性,子图和主图各自画布的经纬度范围不一致。最常见于九段线的绘制。

02、核心代码

给主图增加画中画子图的核心代码如下

axins = fig.add_axes([0.75, 0.07, 0.2, 0.2])
#或
axins = ax.inset_axes([0.75, 0.07, 0.2, 0.2])
函数内的4个参数(x0,y0,width,height)依次为子图的左下角位置、宽度、高度

这4个参数为相对值,必须在0~1的范围内。比如前两个参数x0、y0对应的0.75和0.07表示子图左下角相对于主图左下角从左往右移动75%、从下往上移动7%,第三个参数width对应的0.2表示子图的宽度压缩到20%,第四个参数height对应的0.2表示子图的高度压缩到20%,如下图所示


03、主要代码

绘制画中画,创建主图子图和x、y轴坐标的主要代码如下

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

#创建页面
fig = plt.figure(figsize=(12,11))

# 中文label
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

#创建主图,地图投影为平面投影
ax = plt.axes(projection=ccrs.PlateCarree())

# 主图经纬度范围,此处用x0、x1、y0、y1代替经纬度范围实际值
[lon1,lon2,lat1,lat2] = [x0,x1,y0,y1]
ax.set_extent([lon1,lon2,lat1,lat2], crs=ccrs.PlateCarree())

# --------------------子图----------------------
#创建子图,设定相对位置与大小
axins = ax.inset_axes([0.75, 0.07, 0.2, 0.2])

#子图内根据stn_location2的经纬度进行打点
axins.scatter(stn_location2['LON'],stn_location2['LAT'],
    s=100,color=stn_location2['color'],marker='o')

# 子图经纬度范围,此处用x2、x3、y2、y3代替经纬度范围实际值
axins.set_xlim(x2, x3)
axins.set_ylim(y2, y3)

#保存并关闭图像
plt.savefig('figname.png', format='png',
    bbox_inches='tight',pad_inches = 0.03)
plt.close()

04、常见报错

绘制站点图常见报错:

posx and posy should be finite values

原因:站点坐标含np.nan,在ax.text绘图时np.nan会被解析成无穷大,导致图像无限大并报错

解决方法:预先设置好所有站点的经纬度值

以上就是Python气象绘图:画中画教程的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取