Matplotlib pyplot无法自动关闭并从线程更新重绘问题求助
问题原因
你的代码无法自动更新的核心问题是**plt.show()默认是阻塞式调用**:
- 当主线程执行到
plt.show()时,会停在这里,直到你手动关闭图形窗口,才会继续执行后面的sleep(3)和下一次的Plotter调用。 - 这就导致程序无法自动完成“关闭旧图→绘制新图”的循环,必须手动干预。
解决方案
修改Plotter函数,使用plt.show(block=False)让窗口非阻塞显示,同时配合plt.pause()确保图形能正常渲染:
import numpy as np from matplotlib import pyplot as plt import threading as th from time import sleep Xplot = [] YPlot = [] def RandomXYGen(): x = np.random.normal(5, .75) y = np.random.normal(10, 1.5) return x, y def LoopData(): while True: xdata, ydata = RandomXYGen() Xplot.append(xdata) YPlot.append(ydata) print(xdata, ydata) sleep(0.1) def Plotter(xToPlot, yToPlot): plt.close('all') # 关闭所有旧窗口 plt.figure() # 创建新的绘图窗口 plt.plot(xToPlot, yToPlot) plt.show(block=False) # 非阻塞显示窗口 plt.pause(0.001) # 强制渲染图形,避免窗口空白 t = th.Thread(target=LoopData, daemon=True) t.start() while True: Plotter(Xplot, YPlot) sleep(3)
补充说明
block=False让plt.show()不再阻塞主线程,程序可以继续执行后续的sleep和循环逻辑。plt.pause(0.001)是为了给Matplotlib足够的时间渲染图形,否则可能出现窗口空白的情况。- 每次调用
Plotter时先关闭所有旧窗口,再创建新窗口,符合你“关闭旧图打开新图”的需求。
内容的提问来源于stack exchange,提问作者chepox
相关产品推荐
相关产品推荐

