【AttributeError: 'AxesSubplot' object has no attribute 'add_geometries'】怎么解决
时间: 2025-06-02 22:05:39 浏览: 15
### 解决 Python 中 `AxesSubplot` 对象没有 `add_geometries` 属性的问题
在 Python 中,`matplotlib` 的子图对象(`AxesSubplot`)本身并不支持直接调用 `add_geometries` 方法。这是因为 `add_geometries` 是 `Cartopy` 库中的方法,而 `Cartopy` 的地图投影需要通过特定的 `projection` 参数创建[^1]。
#### 错误原因分析
当使用 `matplotlib.pyplot.subplots()` 创建子图时,默认情况下生成的是标准的 `AxesSubplot` 对象,而不是支持地理空间操作的 `Cartopy` 轴对象。因此,尝试在普通 `AxesSubplot` 对象上调用 `add_geometries` 方法会导致 `AttributeError` 错误。
#### 正确实现方法
要解决此问题,必须确保子图是基于 `Cartopy` 的投影创建的。以下是正确的实现方式:
```python
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
# 定义函数以加载省界线
def load_provinces():
provinces = shpreader.Reader('path_to_province_shapefile/province.shp') # 替换为实际路径
return provinces.geometries()
# 创建带有 Cartopy 投影的子图
fig, axes = plt.subplots(1, 2, subplot_kw={'projection': ccrs.PlateCarree()}, figsize=(12, 6))
# 遍历每个子图并添加省界线
for ax in axes.flat:
ax.set_extent([70, 140, 15, 55], crs=ccrs.PlateCarree()) # 设置地图范围
ax.add_geometries(load_provinces(), ccrs.PlateCarree(), facecolor='none', edgecolor='blue') # 添加省界线
# 显示图形
plt.show()
```
#### 关键点解析
- **`subplot_kw={'projection': ccrs.PlateCarree()}`**:此参数确保子图基于 `Cartopy` 的投影创建,从而支持地理空间操作[^2]。
- **`ax.add_geometries`**:此方法仅适用于 `Cartopy` 轴对象,用于添加几何图形(如省界线)。
- **`set_extent`**:设置地图的显示范围,避免不必要的区域显示。
#### 注意事项
- 如果未正确指定 `projection` 参数,生成的轴对象将无法支持 `add_geometries` 方法。
- 确保安装了最新版本的 `Cartopy` 和 `Matplotlib`,以避免潜在的兼容性问题。
---
阅读全文
相关推荐


















