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

Python中如何更新现有绘图而非创建新绘图?

需求:实现Matplotlib仅更新单图内容,不创建新绘图

我需要实现Python更新绘图时不创建新图,仅更新单个绘图的内容,但在Stack Overflow、谷歌、ChatGPT及Gemini上尝试多种方案均未奏效——要么生成新绘图,要么目标绘图无法更新。我使用PyCharm开发,Python版本为3.10。

以下是我的Visualizer类代码:

import cv2
import matplotlib.pyplot as plt
from Utils import WorldModel


class Visualizer:
    def __init__(self):
        worldmodel = WorldModel.WorldModel()
        self.field_img = cv2.imread("./Visualisation/resources/field.png")
        self.fig, self.ax = plt.subplots()
        self.ax.imshow(self.field_img, extent=[-5200, 5200, -3700, 3700])
        self.ax.set(xlim=(-5200, 5200), ylim=(-3700, 3700), aspect='equal')
        self.team1 = {}  # 存储机器人的matplotlib圆形对象
        self.team2 = {}
        self.ball = None  # 存储球的圆形对象
        for robot in worldmodel.team1positions:
            position = worldmodel.team1positions[robot]
            circle = plt.Circle(position, radius=100, color='blue', alpha=0.8, zorder=2)  # 可调整半径
            print(f"将蓝队机器人{robot}更新至位置{position}")
            self.ax.add_patch(circle)
            self.team1[robot] = circle

        for robot in worldmodel.team2positions:
            position = worldmodel.team2positions[robot]
            circle = plt.Circle(position, radius=100, color='red')  # 可调整半径
            self.ax.add_patch(circle)
            self.team2[robot] = circle

        x, y = worldmodel.ballposition
        self.ball = plt.Circle((x, y), radius=40, color='black')


        # 我还尝试过self.fig.show()、plt.show(block=False)或直接plt.show()
        plt.ion()
        plt.figure()
        plt.show()


    def update(self):
        worldmodel = WorldModel.WorldModel()
        plt.clf()
        for robot in self.team1:
            self.team1[robot].center = worldmodel.team1positions[robot]

        for robot in self.team2:
            self.team2[robot].center = worldmodel.team2positions[robot]

        if self.ball:
            self.ball.center = worldmodel.ballposition

        self.ax.add_patch(self.ball)

        # 这样做绘图完全没有更新
        self.fig.canvas.draw_idle()
        self.fig.canvas.flush_events() # 加不加这句看起来都没区别
        #self.fig.show()   # 这句会创建新图,内容倒是符合预期

        plt.pause(10e-10)

以下是调用update方法的主函数代码:

if __name__ == '__main__':
    print("初始化")
    ball = Ball.Ball()
    field = Field.Field(9, 6, 2.2)
    team_1 = Team.Team("蓝队", Strategy1.Strategy1())
    team_2 = Team.Team("红队", Strategy2.Strategy2())
    worldModel = WorldModel.WorldModel()
    worldModel.setup(ball.get_position(), team_1.get_positions(), team_2.get_positions(), field)
    for robot in team_1.robots:
        robot._world_model = worldModel
    for robot in team_2.robots:
        robot._world_model = worldModel
    rules = Rules
    end_condition = False
    visualizer = Visualizer.Visualizer()
    print("开始模拟")
    worldModel.print()
    visualizer.update()
    #for i in range(0,10):
    while (True):
        team_1.execute_next_actions()
        ball.update_position()
        worldModel.update(ball.get_position(), team_1.get_positions(), team_2.get_positions())
        worldModel.print()
        worldModel.check_collision()
        visualizer.update()

内容的提问来源于stack exchange,提问作者Leah Fernández

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:45:54