绘制不同区域Basemap子图时尺寸不一致,如何让子图尺寸相同?
问题原因
你使用的是等距圆柱投影(cyl),Basemap默认会根据设定的经纬度范围自动调整子图纵横比,保证投影不变形:
- 第一个子图经度跨度为60°(-120到-60),纬度跨度为35°
- 第二个子图经度跨度为50°(40到90),纬度跨度同样为35°
两者经宽纬高的比例不一致,最终渲染的子图尺寸就会出现差异。
解决方法
分两种场景可选:
场景1:允许调整研究区域范围
直接将两个子图的经度跨度设为一致即可,比如把第二个子图的经度范围修改为llcrnrlon=30, urcrnrlon=90,保持和第一个子图相同的60°经度跨度,子图尺寸会自动统一,且不会出现投影变形。
场景2:必须保留现有经纬度范围
可以强制指定两个子图使用相同的纵横比,同时调整子图间距避免标签重叠,修改后的代码如下:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap fig = plt.figure(figsize=(15, 8)) ax1=plt.subplot(1, 2, 1) ax2=plt.subplot(1, 2, 2) # 绘制第一个子图 m1 = Basemap(projection='cyl', resolution='l', llcrnrlat=0, llcrnrlon=-120, urcrnrlat=35, urcrnrlon=-60, ax=ax1) parallels = np.arange(-90.,90,10.) m1.drawparallels(parallels,labels=[1,0,0,0],fontsize=10) meridians = np.arange(0.,360.,10.) m1.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10) m1.drawcoastlines(color='black', linewidth=0.5) # 固定纵横比为纬度跨度/经度跨度 ax1.set_aspect(35/60) # 绘制第二个子图 m2 = Basemap(projection='cyl', resolution='l', llcrnrlat=0, llcrnrlon=40, urcrnrlat=35, urcrnrlon=90, ax=ax2) m2.drawparallels(parallels,labels=[1,0,0,0],fontsize=10) m2.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10) m2.drawcoastlines(color='black', linewidth=0.5) # 强制使用和第一个子图相同的纵横比 ax2.set_aspect(35/60) # 调整子图间距避免标签重叠 plt.subplots_adjust(wspace=0.3) plt.show()
注意:强制设置相同纵横比后,经度跨度更小的子图会出现横向拉伸,投影会有轻微变形。
内容的提问来源于stack exchange,提问作者Aristocrat
相关产品推荐
相关产品推荐

