You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绘制不同区域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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:12:04