JupyterLab运行Python脚本调用Matplotlib绘图无输出报错求助
问题根因
你遇到的AttributeError: 'function' object has no attribute 'called'是IPython 7.27.0与当前安装的matplotlib 3.2.2版本不兼容导致的,IPython的pylabtools.py中的代码错误假设matplotlib的plt.draw_if_interactive函数自带called属性,该属性仅在matplotlib 3.3.0及以上版本才被添加。
同时需要注意:不要使用!python/!python3命令运行脚本,叹号前缀会启动独立子进程执行Python代码,子进程的绘图输出无法传递到Jupyter当前内核,所以永远不会显示图表,必须用%run魔法命令在当前内核上下文运行脚本。
可行解决方案(按优先级排序)
- 方案一(最推荐,无需修改业务代码):升级matplotlib到3.3.0及以上版本,执行命令:
升级完成后重启Jupyter内核,先运行pip install matplotlib>=3.3.0%matplotlib inline,再执行%run pythonscript.py即可正常出图,不会再触发属性报错。 - 方案二(如果项目依赖限制不能升级matplotlib):降级IPython到7.26.0及以下版本,执行命令:
重启内核后即可兼容当前matplotlib 3.2.2版本。pip install ipython==7.26.0 - 方案三(临时应急,无需修改依赖版本):在你的
pythonscript.py文件导入matplotlib的代码后,手动给draw_if_interactive函数补充called属性,示例代码:import matplotlib.pyplot as plt # 手动补充缺失的called属性,适配低版本IPython与matplotlib的组合 plt.draw_if_interactive.called = False
Backtrader绘图补充配置
如果调整依赖后仍无法显示图表,可在调用cerebro.plot()时添加参数iplot=False,关闭Backtrader默认的交互绘图模式,强制走matplotlib渲染,示例代码:
cerebro.plot(iplot=False)
内容的提问来源于stack exchange,提问作者LeggoMaEggo
相关产品推荐
相关产品推荐

