You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

核心修改说明

  1. 图表初始化只做一次:把fig、ax、line和数据列表的创建放到全局,避免重复生成窗口
  2. 数据获取移到update函数:每次动画更新时主动读取最新的压力值,保证数据实时性
  3. 去掉多余的while循环:FuncAnimation会自动按interval参数定时调用update函数,不需要手动循环
  4. 统一使用ax对象:避免混用plt和pyplot,用ax来操作坐标轴,更清晰

这样修改后,就会在同一个窗口里实时更新压力曲线,不会再弹出新图表了。

内容的提问来源于stack exchange,提问作者bttew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:35:30