Python中如何在while循环内使用matplotlib绘制动态折线?
问题原因
你在while循环中传入plt.plot()的t和cash是每次迭代生成的单个数值,而非长度大于等于2的序列:
- 散点模式下单个坐标点就能正常渲染,因此
'r.'参数可以正常显示动态更新的红点 - 折线绘制至少需要两个坐标点才能生成可见线段,单值输入无法生成有效折线,因此画布显示为空白。
另外如果每次循环重复调用plot且不清理旧内容,运行时间长了会出现内存占用持续升高、画面卡顿的问题。
动态折线实现方法
方法1:累计坐标重绘(适合需要保留全段折线的场景)
每次循环将新生成的t、cash值追加到列表中,当列表长度≥2时即可正常渲染连续折线,参考代码:
import matplotlib.pyplot as plt # 初始化存储历史坐标的列表 t_history = [] cash_history = [] plt.figure() # 提前设置固定坐标轴范围,避免画面动态跳动 plt.xlim(t_start, t_end) plt.ylim(c_min, c_max) while 你的循环判断条件: # 原有业务逻辑,生成当前步的t、cash值 current_t = 每次迭代得到的时间值 current_cash = 每次迭代得到的现金值 # 追加新坐标到历史列表 t_history.append(current_t) cash_history.append(current_cash) # 清除上一帧的绘图内容 plt.cla() # 绘制累计的折线 plt.plot(t_history, cash_history, 'r-') # r-表示红色实线 # cla会重置坐标轴属性,需要重新固定范围 plt.xlim(t_start, t_end) plt.ylim(c_min, c_max) plt.pause(0.1) plt.show()
方法2:更新线对象数据(性能更高,适合高频刷新场景)
不需要每次重绘全量元素,只更新已有折线对象的坐标数据,刷新流畅度更高,参考代码:
import matplotlib.pyplot as plt plt.figure() plt.xlim(t_start, t_end) plt.ylim(c_min, c_max) # 初始化空折线对象 line, = plt.plot([], [], 'r-') t_history = [] cash_history = [] while 你的循环判断条件: current_t = 每次迭代得到的时间值 current_cash = 每次迭代得到的现金值 t_history.append(current_t) cash_history.append(current_cash) # 直接更新折线的坐标数据 line.set_data(t_history, cash_history) plt.pause(0.1) plt.show()
注意:如果你每次循环生成的
t和cash本身就是长度≥2的序列,只需要在每次调用plt.plot()前执行plt.cla()清空上一帧内容,再重新设置坐标轴范围即可,否则多帧内容叠加会导致画面混乱。
内容的提问来源于stack exchange,提问作者Mahdi Bss
相关产品推荐
相关产品推荐

