绘制带投影图形的比例缩放问题

修改绘制带有地图投影图形时的图片纵横比。

通过Cartopy和Matplotlib在绘制带有地图投影时,由于固定的投影和经纬度比例,有可能使得图片纵横比固定(例如在绘制北半球范围时,经度范围过长,纬度范围较短,导致图片扁长):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def contour_map(fig,img_extent,spec1,spec2):
fig.set_extent(img_extent, crs=ccrs.PlateCarree())
fig.add_feature(cfeature.COASTLINE.with_scale('50m'))
fig.add_feature(cfeature.LAKES, alpha=0.5)
fig.set_xticks(np.arange(leftlon,rightlon+spec1,spec1), crs=ccrs.PlateCarree())
fig.set_yticks(np.arange(lowerlat,upperlat+spec2,spec2), crs=ccrs.PlateCarree())
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
fig.xaxis.set_major_formatter(lon_formatter)
fig.yaxis.set_major_formatter(lat_formatter)

#设置色阶
vmin = 10
vmax = 34
interval = 2
boundaries = np.arange(vmin, vmax + interval, interval)
norm = BoundaryNorm(boundaries, plt.get_cmap('jet').N, clip=True)
#设置投影和范围
leftlon, rightlon, lowerlat, upperlat = (0,360,0,90)
img_extent = [leftlon, rightlon, lowerlat, upperlat]
proj = ccrs.PlateCarree(central_longitude=150)
#绘图
fig1 = plt.figure(figsize=(12,8))
f1_ax1 = fig1.add_axes([0.1, 0.1, 0.8, 0.4],projection = proj)
contour_map(f1_ax1,img_extent,60,30)
c1 = f1_ax1.pcolormesh(lon,lat,wbgt_mean.mean('time'),norm=norm,
transform=ccrs.PlateCarree(),cmap=cmaps.WhiteBlueGreenYellowRed,zorder=0)
f1_ax1.add_feature(cfeature.OCEAN.with_scale('50m'),facecolor='white',zorder=1)
#绘制色标
cbar1 = fig1.colorbar(c1,cax=fig1.add_axes([0.35, 0.05, 0.3, 0.025]),orientation='horizontal',format='%d',)
cbar1.set_label('unit: °C',fontsize=14)

输出图形如下:

这里调整f1_ax1 = fig1.add_axes([0.1, 0.1, 0.8, 0.4],projection = proj)这句代码中的子图大小参数是不能修改纵横比的。

可以通过添加:

1
f1_ax1.set_aspect(2)

来实现目的:

1
set_aspect(aspect, share=False)

该函数的作用是设置轴缩放的纵横比,即 y/x 缩放。

参数:

aspect:{‘auto’, ‘equal’} 或 float

​ ‘auto’:自动填充子图

​ ‘equal’:与aspect=1相同,即等纵横比

​ float:y 数据坐标中 1 个单位的显示大小将是 x 数据坐标中 1 个单位的显示大小的 aspect 倍; 例如 对于“aspect=2”,数据坐标 中的正方形将以两倍宽度的高度进行渲染。

share:如果为“True”,则将设置应用于所有共享轴。