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
相关产品推荐
相关产品推荐

