使用matplotlib.pyplot.canvas.draw()实现实时绘图失败,程序卡顿求助
解决Matplotlib实时绘图卡顿只显示第一个点的问题
嗨,我之前也踩过这个坑!你遇到的问题主要是因为Matplotlib默认的阻塞式渲染模式,加上用sleep()会卡住GUI线程,还有每次循环都重新绘制整个曲线的方式不对。咱们一步步来改:
问题根源
plt.show()默认是阻塞的,只会在代码执行完后才显示窗口,所以循环里的绘图根本没机会渲染出来sleep(0.5)会阻塞整个程序的GUI事件循环,导致界面卡死- 每次循环都
ax.plot(x,y)会重复绘制所有历史数据,既浪费资源又没法实时更新
修正后的代码
import matplotlib.pyplot as plt from time import sleep # 开启交互式模式,让Matplotlib可以实时更新绘图 plt.ion() x, y = [], [] fig = plt.figure() ax = fig.add_subplot() # 先初始化一个空的线条对象,后面只更新它的数据 line, = ax.plot([], [], 'go') # 设置坐标轴范围,避免每次自动调整范围导致闪烁 ax.set_xlim(0, 10) ax.set_ylim(0, 100) for i in range(10): x.append(i) y.append(i**2 + 1) # 更新线条的数据,而不是重新绘制整个曲线 line.set_data(x, y) # 刷新画布 fig.canvas.draw() # 处理GUI事件,替代sleep,防止卡顿 plt.pause(0.5) # 关闭交互式模式,保持窗口显示 plt.ioff() plt.show()
关键修改点
- 用
plt.ion()开启交互式模式,这是实时绘图的核心,让Matplotlib不再等到最后才渲染 - 初始化
line, = ax.plot([], [], 'go'),注意逗号!这样我们得到的是线条对象,后续只需要更新它的x和y数据,不用重复绘制 - 用
plt.pause(0.5)代替sleep(0.5),pause()不仅会暂停指定时间,还会处理GUI的渲染事件,避免界面卡死 - 提前设置坐标轴范围
ax.set_xlim()和ax.set_ylim(),防止每次绘图自动调整范围导致画面闪烁
如果换成while True循环,逻辑也是一样的,记得加个退出条件(比如按某个键停止),不然会无限循环哦。
内容的提问来源于stack exchange,提问作者TheodorosNikoleris
相关产品推荐
相关产品推荐

