求助:Matplotlib/Geopandas绘图突然异常缓慢,代码未改动
Geopandas与Matplotlib绘图突然异常缓慢的问题排查
问题详情
- 运行环境:JupyterLab,远程服务器、本地机器均出现相同症状,CPU负载等系统指标无异常
- 异常现象:代码未做任何修改,原本50秒完成的地图着色绘图操作,现在耗时长达50分钟;首次出现于点击「重启内核并全部运行」之后
- 依赖版本:
- Matplotlib 3.5.1
- Geopandas 0.12.0
- Pandas 1.4.2
- Python 3.9.12
- 慢执行代码段:
fig, ax = plt.subplots(figsize=(7.5,7.5), dpi = 100) shape.plot(ax=ax, facecolor='Grey', color= 'white') shape.plot(ax=ax, column='datacol', cmap='Blues'); ax = plt.gca() ax.set_facecolor('xkcd:white') fig.savefig(path, facecolor='white', dpi = fig.dpi)
排查与解决方向
检查GeoDataFrame几何有效性
重启内核后重新加载的shp文件可能存在无效几何(如自相交)或重复数据,这类问题会大幅拖慢渲染速度。执行以下代码检查:print(shape.geometry.is_valid.value_counts())若存在无效几何,用
shape = shape.make_valid()修复后再尝试绘图。合并重复绘图调用
当前代码两次调用shape.plot(),会重复处理整个GeoDataFrame的几何数据。合并成一次调用可直接减少计算开销:fig, ax = plt.subplots(figsize=(7.5,7.5), dpi=100) # 一次完成底图、数据着色与边界设置 shape.plot(ax=ax, column='datacol', cmap='Blues', edgecolor='white', facecolor='Grey') ax.set_facecolor('xkcd:white') fig.savefig(path, facecolor='white', dpi=fig.dpi)切换Matplotlib后端
JupyterLab的交互式后端(如ipympl)在渲染复杂几何时可能变慢,可强制使用非交互式后端:
在代码开头添加:import matplotlib matplotlib.use('Agg')绘图完成后用
plt.show()显示静态图即可。简化几何数据
若shp文件的几何顶点过多,会增加渲染压力。对数据做适当简化:# tolerance值根据数据精度调整,单位与数据坐标系一致 shape['geometry'] = shape.geometry.simplify(tolerance=0.01)清理Matplotlib残留对象
重启内核后可能存在未释放的绘图对象,干扰当前渲染。在绘图代码前添加:plt.close('all')
内容的提问来源于stack exchange,提问作者marcellobello
相关产品推荐
相关产品推荐

