Matplotlib读取新数据弹出新图表而非更新现有图表问题求助
问题解决:Matplotlib实时绘图重复弹出新窗口
你的核心问题是把图表初始化和动画创建逻辑放在了while循环内部,导致每次循环都会生成新的Figure和窗口,同时数据列表也被反复清空,无法累积数据。下面是修复后的代码和关键说明:
关键问题点
- 原代码在while循环里重复创建
figure、line和FuncAnimation,每次循环都弹出新窗口 x_data和y_data每次循环被重置为空,无法保留历史数据- 数据获取逻辑和动画更新逻辑分离,导致
response4无法实时更新
修复后的完整代码
import socket import sys import time from datetime import datetime import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # TVAC IP and Port target_host = "10.1.2.121" target_port = 50 # 初始化TCP连接 try: client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((target_host, target_port)) print("Socket Created (⌐⊙_⊙)") print(f"Socket Connected To {target_host}") except socket.error: print("Socket Not Created! ¯\(°_o)/¯") sys.exit() # 初始化Matplotlib图表 fig, ax = plt.subplots() ax.set_yscale('symlog') ax.grid(True) ax.ticklabel_format(axis='y', style='sci', scilimits=(0, 0)) x_data, y_data = [], [] line, = ax.plot_date(x_data, y_data, '-') # 命令定义 cmd = "?VP" CR = "\r" def update(frame): global x_data, y_data try: # 发送命令并获取最新压力值 client.send(bytes(cmd + CR + '\0', 'ascii')) response = client.recv(1024).decode('ascii') # 解析响应数据 response2 = response[3:-1] response3 = response2.replace("E", "e") pressure = float(response3) print(response3) # 更新数据列表 x_data.append(datetime.now()) y_data.append(pressure) # 更新绘图数据 line.set_data(x_data, y_data) # 自动调整坐标轴范围 ax.relim() ax.autoscale_view() except socket.error: print("Failed to send command") return line, # 创建动画,每隔200ms更新一次 anim = FuncAnimation(fig, update, interval=200, cache_frame_data=False) plt.show()
核心修改说明
- 图表初始化只做一次:把
fig、ax、line和数据列表的创建放到全局,避免重复生成窗口 - 数据获取移到update函数:每次动画更新时主动读取最新的压力值,保证数据实时性
- 去掉多余的while循环:
FuncAnimation会自动按interval参数定时调用update函数,不需要手动循环 - 统一使用ax对象:避免混用
plt和pyplot,用ax来操作坐标轴,更清晰
这样修改后,就会在同一个窗口里实时更新压力曲线,不会再弹出新图表了。
内容的提问来源于stack exchange,提问作者bttew
相关产品推荐
相关产品推荐

