У меня есть простой симулятор 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()