VSCode Jupyter下Matplotlib图表重复绘制问题咨询
现象原因
这一表现不是Matplotlib配置错误导致,是VS Code Jupyter 环境的默认渲染规则和Matplotlib后端机制共同作用的结果:
- Jupyter默认启用Matplotlib的
inline内联后端,会在每个代码单元格执行结束后,自动扫描全局活跃的Matplotlib图表对象并渲染输出,这个捕获逻辑和普通数值对象不同:哪怕你把Figure对象赋值给了变量,只要它还在Matplotlib的全局图表栈里,就会被自动渲染,这就是my_fig = random_figure()依然会出图的原因。 - 直接执行
random_figure()时出现两次重复渲染,是触发了两套输出逻辑:第一遍是inline后端自动扫描活跃图表的渲染,第二遍是函数返回的Figure对象作为单元格最后一行的执行结果,被Jupyter默认的返回值输出逻辑捕获后再次渲染。
解决方法
你可以通过修改函数逻辑,让创建的Figure对象在返回前脱离Matplotlib全局栈,就能实现和普通返回值函数一致的表现:赋值时无输出,主动调用展示时才渲染图表。修改后的代码如下:
import matplotlib.pyplot as plt import numpy as np def random_figure(): fig, axes = plt.subplots(2, 1, squeeze=True) for ax in axes: ax.plot(*np.random.rand(10, 2)) # 将当前图表从pyplot全局活跃栈中移除,避免被后端自动捕获渲染 plt.close(fig) return fig
如果需要全局关闭Matplotlib的自动出图行为,可以在Notebook最开头运行plt.ioff()开启非交互模式,后续所有图表都只会在你主动调用display(fig)或plt.show()时才会显示。
内容的提问来源于stack exchange,提问作者ElRudi
相关产品推荐
相关产品推荐

