Как добавить элемент в matplotlib PatchCollection - PullRequest
0 голосов
/ 11 марта 2020

У меня есть простой симулятор traffi c, работающий с использованием возможностей FuncAnimation в matplotlib. Автомобили отображаются в виде плюса или квадрата:

line,carLocs = ax.plot([], [],"r+"),ax.plot([], [],"bs")

И эти значения обновляются в функции «animate»:

def animate(i):
. . . (compute new car location)
return line,carLocs

Я хотел бы отображать автомобили в виде прямоугольника , поэтому я искал далеко и широко, и консенсус, кажется, добавляет коллекцию (Patch) к осям:

ax.add_collection(patchColl)

Но после попытки следовать всем примерам, которые я видел, я не могу получить любые прямоугольники для отображения. Использование плюса или квадрата, кажется, работает, назначая график переменной, а затем возвращая обновленные значения для этих переменных. Я попробовал эту схему для прямоугольников, но не повезло. Кажется, примеры показывают, что коллекция, добавляемая к графику, уже должна быть загружена с тем, что должно быть отображено, поскольку после дальнейшего эксперимента по добавлению прямоугольника в коллекцию перед началом цикла «одушевления» это отображается. Примеры выглядят так, будто я могу изменить только некоторые свойства в анимации l oop. Но могу ли я отредактировать сам контент коллекции? В симуляции хочу динамически добавлять и удалять машины. Как я могу это сделать? Спасибо за любые предложения. Текущий код ниже.

  1 from random import random
  2 import time
  3 import math
  4 from matplotlib import pyplot as plt
  5 from matplotlib.animation import FuncAnimation
  6 import matplotlib.patches as mpatches
  7 from matplotlib.collections import PatchCollection
  8
  9 fig = plt.figure(figsize=(12,12))
 10 ax = plt.axes(xlim=(0, 11), ylim=(0, 11))
 11 #print("type(ax):",type((ax.plot([], [],"r+"),ax.plot([], [],"bs"))))
 12 #line,carLocs = ax.plot([], [],"r+"),ax.plot([], [],"bs")
 13 patches=[]
 14 print(type(patches))
 15 patches.append(mpatches.Rectangle((5,6),0.5,0.5))
 16 patchColl=PatchCollection(patches)
 17 print(type(patchColl))
 18 #carRects=ax.add_collection(PatchCollection(patches))  # list of car rectangles
 19 ax.add_collection(patchColl)  # list of car rectangles
 20 #print(type(carRects))
 21
 22 class Car:
 23   carNum=0
 24   def __init__(self,pref=None):
 25     self.carNum=Car.carNum
 26     self.pref=pref    # preferred speed (MPH), else use Path speed limit
 27     self.path=None    # which path this car is on; this determines start intersection and light
 28     self.dist=0    # distance from start intersection
 29     self.locX=10*random()
 30     self.locY=10*random()
 31     self.speed=10+100*random()
 32     #print("Created car with carNum:%d" % self.carNum)
 33     Car.carNum+=1     # class variable, for car numbering
 34   def update(self):
 35     print("Update X by %.3f" % (((timeInc/1000)/3600.)*10))
 36     self.locX+=self.speed*((timeInc/1000)/3600.)*10     # time in milliseconds, speed in mph,
 37
 38 # Maker some cars
 39 cars={}
 40 newcar=Car()
 41 cars[newcar.carNum]=newcar
 42 newcar=Car()
 43 cars[newcar.carNum]=newcar
 44 newcar=Car()
 45 cars[newcar.carNum]=newcar
 46
 47 # Main simulation loop
 48 timeInc=100             # milliseconds, so can use this in 'animate' call
 49 curTime=0                # current time
 50 timeEnd=100           # ending time
 51
 52 def animate(i):
 53   for car in cars.keys():
 54     print("Creating rectangle for car %d at %.2f,%.2f moving %.2f" % (car,cars[car].locX,cars[ca    r].locY,cars[car].speed))
 55     patches.append(mpatches.Rectangle((cars[car].locX,cars[car].locY),0.5,0.5))
 56     cars[car].update()
 57   #return PatchCollection(patches)
 58   patchColl=PatchCollection(patches)
 59   return patchColl,
 60
 61 anim = FuncAnimation(fig, animate, interval=timeInc, blit=False)
 62 plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...