You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何plt.draw()迭代绘图在Python正常却无法在Jupyter Notebook运行?

解决Jupyter Notebook中Matplotlib迭代绘图不更新的问题

Jupyter默认的%matplotlib inline后端是静态渲染模式,无法支持plt.draw()的动态更新逻辑,以下两种方法可解决该问题:

方法1:切换到交互式后端

在Notebook开头添加魔法命令启用交互式后端,推荐使用%matplotlib widget(现代交互式后端,支持更多交互功能),同时优化绘图逻辑以提升效率:

%matplotlib widget
import matplotlib.pyplot as plt 
import numpy as np

N=5
x = np.arange(-3, 3, 0.01)
fig = plt.figure()
ax = fig.add_subplot(111)
# 初始化空线条,后续仅更新数据
line, = ax.plot([], [])
ax.set_xlim(-3, 3)
ax.set_ylim(-1, 1)

for n in range(N):
    y = np.sin(np.pi*x*n)
    line.set_data(x, y)
    fig.canvas.draw()
    fig.canvas.flush_events()
    plt.pause(0.5)
  • 用set_data更新现有线条的数据,比反复创建/删除线条更高效
  • fig.canvas.draw()和flush_events()确保后端实时渲染更新内容

方法2:在inline模式下清除旧输出

如果不想切换后端,可借助IPython.display.clear_output在每次绘图前清除旧输出,减少闪烁:

%matplotlib inline
import matplotlib.pyplot as plt 
import numpy as np
from IPython.display import clear_output

N=5
x = np.arange(-3, 3, 0.01)
fig, ax = plt.subplots()
ax.set_xlim(-3, 3)
ax.set_ylim(-1, 1)

for n in range(N):
    y = np.sin(np.pi*x*n)
    ax.clear()
    ax.plot(x, y)
    plt.show()
    clear_output(wait=True)  # 等待新图渲染后再清除旧输出
    plt.pause(0.5)

Plotly在Jupyter Notebook实现迭代绘图

完全可以,Plotly对Jupyter的动态绘图支持非常友好,提供两种高效实现方式:

方式1:快速实现(Plotly Express + 输出清除)

import plotly.express as px
import numpy as np
from IPython.display import clear_output, display

N=5
x = np.arange(-3, 3, 0.01)

for n in range(N):
    y = np.sin(np.pi*x*n)
    fig = px.line(x=x, y=y, range_x=[-3,3], range_y=[-1,1])
    clear_output(wait=True)
    display(fig)
    plt.pause(0.5)

方式2:高效动态更新(Plotly Graph Objects)

通过直接更新已有图表的数据,避免重复创建图表,性能更优且交互性更强:

import plotly.graph_objects as go
import numpy as np
from IPython.display import display

N=5
x = np.arange(-3, 3, 0.01)

# 初始化空图表
fig = go.Figure(data=[go.Scatter(x=[], y=[], mode='lines')])
fig.update_layout(xaxis_range=[-3,3], yaxis_range=[-1,1])
display(fig)

for n in range(N):
    y = np.sin(np.pi*x*n)
    # 更新图表数据
    fig.data[0].x = x
    fig.data[0].y = y
    fig.update()
    plt.pause(0.5)

这种方式生成的图表自带缩放、平移等交互控件,用户体验更佳。


内容的提问来源于stack exchange,提问作者Joonho Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:13:11