You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python脚本调用matplotlib.pyplot的plt.show时终止,求实时绘图方案

解决Matplotlib实时绘图时plt.show()导致脚本终止的问题

我来帮你搞定这个实时绘图的问题!你遇到的核心问题是默认的plt.show()是阻塞式的——它会暂停整个程序直到你关闭绘图窗口,这直接导致你的仿真任务被终止,没法继续运行。要实现实时追踪仿真状态的动态绘图,得调整Matplotlib的交互模式和绘图逻辑,下面是具体的解决步骤:

关键修改点

  • 启用交互模式:用plt.ion()开启Matplotlib的交互模式,这样绘图操作不会阻塞主线程,仿真任务能继续运行。
  • 提前初始化绘图元素:把创建figure、subplot和初始线条的代码放在循环外面,避免重复创建导致的资源浪费和绘图混乱。
  • 动态更新数据而非重绘整个图:每次迭代只更新已有线条的数据,然后刷新绘图窗口,而不是重新创建整个图表。
  • plt.pause()代替单纯的plt.draw()pause()不仅会刷新绘图,还会处理Matplotlib的事件循环,防止窗口假死。
  • 仿真结束后保持窗口:任务完成后关闭交互模式,再调用plt.show()来保留绘图窗口,方便查看最终结果。

修改后的完整monitor函数示例

import matplotlib.pyplot as plt

def monitor(FSI_config, tracking):
    print("Tracking...")
    
    # 1. 开启交互模式
    plt.ion()
    
    # 2. 初始化绘图元素(只做一次)
    fig = plt.figure(1)
    ax1 = plt.subplot(211)
    # 初始化线条,先传入空数据或者初始数据
    line1, = ax1.plot([], [], label='Tracking Velocity')
    ax1.set_ylabel('Velocity')
    ax1.legend()
    
    # 遍历仿真数据并实时更新绘图
    it = []
    for i in range(len(tracking.tracking_vel)):
        it.append(i)
        # 3. 更新线条数据
        line1.set_data(it, tracking.tracking_vel[:i+1])
        
        # 自动调整坐标轴范围(可选,避免数据超出视图)
        ax1.relim()
        ax1.autoscale_view()
        
        # 4. 刷新绘图
        fig.canvas.draw()
        plt.pause(0.001)  # 短暂暂停,让绘图窗口响应
    
    # 5. 仿真结束后,关闭交互模式并保持窗口
    plt.ioff()
    plt.show()

额外注意事项

  • 如果你的仿真任务是多线程/多进程运行的,要注意Matplotlib的绘图操作必须在主线程中执行,不然会出现崩溃或者不显示的问题。
  • 要是你的tracking.tracking_vel是实时逐步追加的(不是一开始就有完整数据),可以把循环改成while True的形式,每次检查是否有新数据再更新,比如:
    it = []
    while True:
        current_len = len(tracking.tracking_vel)
        if current_len > len(it):
            # 有新数据,更新绘图
            new_idx = len(it)
            it.append(new_idx)
            line1.set_data(it, tracking.tracking_vel[:new_idx+1])
            ax1.relim()
            ax1.autoscale_view()
            fig.canvas.draw()
            plt.pause(0.001)
        # 可以加个退出条件,比如仿真完成的标志
        if simulation_finished:
            break
    

内容的提问来源于stack exchange,提问作者Rocco B.

火山引擎 最新活动