如何在 python 中更新绘图而不是创建新绘图?

问题描述 投票:0回答:1

我想知道如何实现它,每当我更新绘图时,python 都不会创建新绘图。我只想要一个可以更新其内容的图。我已经在堆栈溢出、Google、ChatGPT 和 Gemini 上花了几个小时,但似乎没有提出解决方案。要么正在创建新的绘图,要么我想要的一个绘图不会自行更新。我在这里缺少什么?

我正在使用 PyCharm,我的 Paython 版本是 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 = {}  # Store robot circles as matplotlib objects
        self.team2 = {}
        self.ball = None  # Store the ball circle
        for robot in worldmodel.team1positions:
            position = worldmodel.team1positions[robot]
            circle = plt.Circle(position, radius=100, color='blue', alpha=0.8, zorder=2)  # Adjust radius as needed
            print(f"Updating team 1 robot {robot} to {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')  # Adjust radius as needed
            self.ax.add_patch(circle)
            self.team2[robot] = circle

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


        #Here I have tried also self.fig.show(), plt.show(block=False) or just 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)

        #With this the plot is not being updated at all
        self.fig.canvas.draw_idle()
        self.fig.canvas.flush_events() #Having this or not doesn't seem to make a 
        difference
        #self.fig.show()   #this creates new plots the way I expect them to be

        plt.pause(10e-10)

这是我的主要部分,我在其中调用更新方法

if __name__ == '__main__':
    print("Initialize")
    ball = Ball.Ball()
    field = Field.Field(9, 6, 2.2)
    team_1 = Team.Team("Team 1", Strategy1.Strategy1())
    team_2 = Team.Team("Team 2", 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("Starting simulation")
    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()
        
python python-3.x matplotlib pycharm
1个回答
0
投票

我发现:代码是正确的,但是因为绘图是直接在 PyCharm 中打开的,所以它没有更新。该图必须在单独的窗口中打开。我通过转到“文件”->“设置”->“工具”->“Python 绘图”并取消选中“在工具窗口中显示绘图”框来实现此目的。

© www.soinside.com 2019 - 2024. All rights reserved.