Matplotlib中fig1首次显示为空,重新执行却正常的原因咨询
问题:Matplotlib图表首次显示无数据,二次调用却正常?
我写了一个用于格式化图表并返回结果的plot()函数,执行以下代码时:
ReturnValues = plot() plt.show(block=False) fig1
此时显示的图表坐标轴设置正确,但没有数据;但在新单元格中输入fig1时,图表却能正常显示数据和完整内容。
plot()函数的核心代码如下:
fig1 = plt.Figure() ax = fig1.add_subplot(111) ax.plot(x_axis, y_axis) ax.set_ylabel(plot_y) ax.set_xlabel(plot_x)
其中fig1和ax是全局变量,函数最后返回包含fig1、ax的结果集。想知道为什么会出现这种首次显示无数据的情况?
回答
核心原因
问题出在你创建Figure的方式和matplotlib的渲染机制不匹配:
- 你用
plt.Figure()创建的是一个独立的面向对象Figure实例,它不会自动加入matplotlib pyplot模块的全局状态管理中。 - 当你调用
plt.show(block=False)时,它默认显示的是pyplot当前活跃的Figure(通过plt.gcf()获取),而这个活跃Figure并不是你创建的fig1——你看到的“坐标轴正确但无数据”的图表,其实是pyplot自动生成的新空Figure,和你的fig1无关。 - 而在单元格中直接输入
fig1时,Jupyter的渲染机制会直接处理这个独立的Figure对象,此时所有绘图操作(ax.plot())都已经完成,所以能正常显示数据。
另外还有一种可能:在调用plt.show()时,fig1的画布还未完成数据绘制——matplotlib的面向对象API中,部分操作需要手动触发画布更新,而Jupyter渲染Figure时会自动完成这一步。
解决方法
你可以选以下任意一种方式修复:
改用
plt.figure()创建Figure
用plt.figure()替代plt.Figure(),这样创建的Figure会自动成为pyplot的当前活跃Figure,plt.show()就能直接显示它:fig1 = plt.figure() # 替换plt.Figure() ax = fig1.add_subplot(111) ax.plot(x_axis, y_axis) ax.set_ylabel(plot_y) ax.set_xlabel(plot_x)显式指定
plt.show()要显示的Figure
保留plt.Figure()的创建方式,在调用plt.show()时直接传入fig1:ReturnValues = plot() plt.show(block=False, figure=fig1) fig1手动触发画布绘制
在plot()函数中,完成绘图后手动调用画布的绘制方法:fig1 = plt.Figure() ax = fig1.add_subplot(111) ax.plot(x_axis, y_axis) ax.set_ylabel(plot_y) ax.set_xlabel(plot_x) fig1.canvas.draw() # 添加这行代码
内容的提问来源于stack exchange,提问作者eoshatz42
相关产品推荐
相关产品推荐

