Python中如何对齐数据子图与地图子图的Y轴(纬度)
让Matplotlib子图与Basemap地图的纬度轴精准对齐
我来帮你搞定这个两个子图纬度重合的问题!核心难点在于Basemap的Mercator投影是非线性的——纬度越高,在图上的拉伸程度越大,直接用普通子图的Y轴刻度肯定对不上。下面是具体的解决方法和修改后的代码:
关键思路
- 让数据子图和地图子图共享Y轴范围,保证两者的垂直长度完全一致;
- 把数据中的纬度值转换成Basemap投影后的坐标,这样数据点的位置才能和地图的纬度一一对应;
- 手动给数据子图设置实际的纬度刻度标签,避免显示投影坐标。
修改后的完整代码
import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap import numpy as np # 创建图形 fig_mapa = plt.figure(figsize=(12, 6)) # ---------------------- 右侧地图子图 ---------------------- ax1 = fig_mapa.add_subplot(122) # 初始化Basemap,保持你的原始参数 map = Basemap(llcrnrlon=-90, llcrnrlat=-58.1, urcrnrlon=-32, urcrnrlat=12.6, resolution='f', projection='merc', lon_0=-58, lat_0=-25, ax=ax1) # 绘制经纬线,补全你未写完的labels参数 map.drawparallels(np.arange(-90, 90., 5), labels=[0,1,0,0]) map.drawmeridians(np.arange(-180, 180., 10), labels=[0,0,0,1]) map.drawcoastlines(color='#333333') map.fillcontinents(color='#eeeeee', lake_color='#ffffff') # ---------------------- 左侧数据子图 ---------------------- # 关键:用sharey=ax1让两个子图共享Y轴范围 ax2 = fig_mapa.add_subplot(121, sharey=ax1) # 模拟你的数据(替换成你自己的真实数据) lat_data = np.linspace(-58.1, 12.6, 100) # 覆盖地图的纬度范围 value_data = np.random.randn(100) # 对应的数据值 # 把纬度转换成Basemap投影后的y坐标(经度随便填一个,只取y值) y_proj = map(lat_data * 0, lat_data)[1] # 绘制数据 ax2.plot(value_data, y_proj, linewidth=2, color='#2e86ab') # 设置左侧子图的Y轴刻度为实际纬度值 # 选择和地图一致的纬度间隔 lat_ticks = np.arange(-58.1, 12.6 + 1, 5) # 把刻度纬度转换成投影坐标 y_ticks_proj = map(lat_ticks * 0, lat_ticks)[1] # 设置刻度和标签,区分南北纬 ax2.set_yticks(y_ticks_proj) ax2.set_yticklabels([f"{lat:.1f}°S" if lat < 0 else f"{lat:.1f}°N" for lat in lat_ticks]) ax2.set_ylabel('纬度') ax2.set_xlabel('数据值') ax2.grid(alpha=0.3) # 调整布局,避免子图重叠 plt.tight_layout() plt.show()
重点说明
sharey=ax1是核心:它会强制左侧子图的Y轴范围和地图子图完全一致,不会出现上下错位;- 投影转换:
map(lon, lat)方法会把经纬度转换成Basemap的投影坐标,这里我们只需要y坐标来对齐纬度; - 刻度标签:手动设置成实际纬度值,让左侧子图的可读性更强,和地图的经纬线完全对应。
这样修改后,你左侧数据图的Y轴纬度就会和右侧地图的纬度完美重合啦!
内容的提问来源于stack exchange,提问作者Sebastian Cabrera Troncoso
相关产品推荐
相关产品推荐

