matplotlib同一窗口绘制数量动态变化的多曲线更新问题
matplotlib多曲线更新解决方案
你的代码存在两个核心问题:
plt.show()默认是阻塞调用,第一次执行后必须手动关闭绘图窗口,才会运行后续的第二次绘图逻辑,且默认会重新生成新窗口,无法复用同个窗口- 第二次绘图时没有清空上一轮的90条曲线,会直接叠加绘制,最终窗口内会同时存在170条曲线
修正思路
- 开启matplotlib交互模式,避免绘图操作阻塞代码执行
- 每次绘制新数据前,清空坐标轴上已有的所有旧曲线
- 每次绘制完成后主动刷新画布,可按需添加停留等待逻辑,方便观察前后两组数据的效果
修正后代码
import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots() fig.subplots_adjust(right=0.78) # 开启交互模式,绘图不阻塞 plt.ion() _x = [] _y = [] _y1 = [] _x1 = [] for x in range(90): _x.append(np.linspace(0, 10*np.pi, 100)) _y.append(np.sin(_x[x])+x) for x in range(80): _x1.append(np.linspace(0, 10*np.pi, 150)) _y1.append(np.tan(_x1[x]+x)) def narysuj(__x, __y): # 清空上一轮的所有曲线 ax.clear() ax.set_prop_cycle(color=plt.cm.gist_rainbow(np.linspace(0, 1, len(__x)))) for x in range(len(__x)): ax.plot(__x[x], __y[x], label=f"Label {x}") # 刷新画布 fig.canvas.draw() # 停留3秒看效果,可替换为plt.waitforbuttonpress()实现按任意键切换 plt.pause(3) # 绘制第一组数据 narysuj(_x, _y) # 绘制第二组数据 narysuj(_x1, _y1) # 最后关闭交互模式,调用show阻塞防止窗口直接退出 plt.ioff() plt.show()
额外优化提示
你原来代码里逐点遍历把数组元素塞到新列表再绘图的逻辑完全没有必要,numpy数组可以直接传给ax.plot()使用,能大幅提升绘图效率。
内容的提问来源于stack exchange,提问作者Plebania
相关产品推荐
相关产品推荐

