气象绘图中常遇到需要画中画显示的情景,多见于地图显示(如下图,已隐去经纬度细节),由于边缘几个站点远离画面主体,直接平铺直叙地将所有站点绘于一张画布,会导致要素在图片内过于分散,不便于用户快速获取重要气象信息。
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会被解析成无穷大,导致图像无限大并报错
解决方法:预先设置好所有站点的经纬度值
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/11457/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取