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
相关产品推荐
相关产品推荐

