contextily.add_basemap()未正确适配轴范围问题求助
解决contextily底图无法覆盖整个子图的问题
问题描述
我想要创建一个包含两个子图的matplotlib图形,其中一个子图为地图并使用contextily添加底图。为保证轴比例为aspect="equal"且两个子图高度一致,我给该轴设置了adjustable="datalim",但contextily没能识别轴范围的变化,导致底图仅在子图的部分区域显示。
示例代码:
import contextily as cx import matplotlib.pyplot as plt fig, axes = plt.subplots(nrows=1,ncols=2) axes[0].plot([0,1],[0,1],marker="o") axes[1].plot([7.60,11.13],[51.81,52.10]) axes[1].set(aspect="equal", adjustable="datalim") cx.add_basemap(axes[1],crs="EPSG:4326")
运行后,底图仅填充子图的左侧部分,无法覆盖整个轴区域。
解决方案
问题根源在于adjustable="datalim"会在图形绘制阶段才调整轴的显示范围,而contextily是基于调用add_basemap时的轴范围来加载底图的,此时轴范围还未更新。
只需在添加底图前强制matplotlib更新轴的显示范围即可,具体步骤如下:
- 设置轴属性后,调用
fig.canvas.draw()触发轴范围的计算与更新 - 再调用
cx.add_basemap()添加底图
修改后的完整代码:
import contextily as cx import matplotlib.pyplot as plt fig, axes = plt.subplots(nrows=1,ncols=2) axes[0].plot([0,1],[0,1],marker="o") axes[1].plot([7.60,11.13],[51.81,52.10]) axes[1].set(aspect="equal", adjustable="datalim") # 强制更新轴显示范围 fig.canvas.draw() cx.add_basemap(axes[1], crs="EPSG:4326") plt.show()
此方法无需手动计算轴的范围,能自动适配adjustable="datalim"带来的轴变化,确保底图完全覆盖子图区域。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

