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

Geopandas plotting()调用matplotlib.pyplot触发isinstance()参数2类型错误

问题环境
  • matplotlib 版本:3.5.1
  • geopandas 版本:0.9.0
异常触发代码
pos = Figure(figsize=PAGE_DIMS,tight_layout=LAYOUT_DICT)
pos.suptitle("Pos", x=1, y=4, color='g')
b_pos = pos.add_gridspec(3, 9)
ax = pos.add_subplot(b_pos[0, 1:4])
world = geopandas.read_file(geopandas.datasets.get_path('file_name'))
world.plot(ax=ax, color='lightblue', edgecolor='black')
错误现象

运行代码抛出异常:TypeError: isinstance() arg 2 must be a type or tuple of types
调用栈追踪到的异常触发路径:

  • geopandas 的plotting模块中plot_series方法调用plt.draw()
  • 调用逐层传递到matplotlib.pyplot的figure函数
  • 执行if isinstance(num, Figure):类型判断时抛出错误
    尝试降级相关依赖无法解决问题,手动注释matplotlib源码中这段判断逻辑可以得到预期输出。
问题原因

这个兼容问题的核心是手动实例化的Figure对象没有被matplotlib pyplot的全局状态机接管,加上geopandas 0.9.0和matplotlib 3.5.x的接口适配缺陷:
直接从matplotlib.figure导入Figure类手动创建画布时,geopandas绘图过程中调用plt.draw()会触发pyplot自动查找当前活跃画布的逻辑,此时传入isinstance判断的第二个参数不是合法的类型对象,直接触发类型错误。

解决方案

不需要修改matplotlib源码,按实际场景选择以下正规方案即可:

  • 方案1(改造成本最低,常规绘图场景推荐):放弃手动实例化Figure,改用pyplot官方接口创建被状态机管理的画布,修改示例:
import matplotlib.pyplot as plt
# 用plt.figure创建画布,替代手动实例化Figure
pos = plt.figure(figsize=PAGE_DIMS, tight_layout=LAYOUT_DICT)
pos.suptitle("Pos", x=1, y=4, color='g')
b_pos = pos.add_gridspec(3, 9)
ax = pos.add_subplot(b_pos[0, 1:4])
world = geopandas.read_file(geopandas.datasets.get_path('file_name'))
world.plot(ax=ax, color='lightblue', edgecolor='black')
  • 方案2(适配画布嵌入GUI等必须手动创建Figure的场景):在绘图前手动将你创建的Figure实例注册到pyplot的全局画布管理器,只需要新增一行注册代码:
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

pos = Figure(figsize=PAGE_DIMS,tight_layout=LAYOUT_DICT)
# 新增下一行,手动注册画布到pyplot状态机
plt.figure(num=pos)
pos.suptitle("Pos", x=1, y=4, color='g')
b_pos = pos.add_gridspec(3, 9)
ax = pos.add_subplot(b_pos[0, 1:4])
world = geopandas.read_file(geopandas.datasets.get_path('file_name'))
world.plot(ax=ax, color='lightblue', edgecolor='black')
  • 方案3(版本修复方案):将geopandas升级到0.10.0及以上版本,该版本已经修复了和matplotlib 3.5.x系列的手动Figure实例兼容问题,原有代码不需要改动即可正常运行。

注意:不推荐通过注释matplotlib源码的方式绕过问题,后续版本升级会丢失修改,还可能引发其他渲染异常。

内容的提问来源于stack exchange,提问作者maester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:27:22