【问题标题】:How to animate multiple points moving using funcanimation (not ax.scatter())?如何使用funcanimation(不是ax.scatter())为移动的多个点设置动画?
【发布时间】:2021-03-08 14:50:20
【问题描述】:

我有下面的代码。如果您运行该程序,则会创建一个散点图。剧情非常混乱。我希望每个点都代表一辆车。我只想在动画中看到每辆车当前位置的点。我不太擅长 matplotlib,但我该怎么做呢?

from matplotlib import pyplot as plt
import random
import math
from matplotlib import animation
import numpy as np

roadLength    = 100
numFrames     = 200

numCars = 60
velocities = []
positions     = []
theta         = []
r             = []
color         = []
probability = 0.5
vmax = 1
flowr = []

fig = plt.figure()
ax = fig.add_subplot(111, projection='polar')
ax.axis('off')


for i in range(numCars):
    positions.append(i * 2)
    theta.append(0)
    r.append(1)
    color.append(i)
    velocities.append(0)


def pos(k):
    rand = random.uniform(0,1)
    if velocities[k] < vmax:
        velocities[k] +=  1
    if k < numCars-1 and (positions[k+1] - positions[k]) <= velocities[k]:
        velocities[k] = positions[k+1] - positions[k] - 1
    if k == numCars-1 and (roadLength - (positions[k] - positions[0])) <= velocities[k]:
        velocities[k] = roadLength - (positions[k] - positions[0]) - 1

    if rand < probability and velocities[k] > 0:
        velocities[k] = velocities[k] - 1
    positions[k] = positions[k] + velocities[k]
    return positions[k]




def animate(frameNr):
    for i in range(numCars):
        theta[i] = pos(i) * 2 * math.pi / roadLength
        flowr.append(velocities[i])
    ax.scatter(theta, r, c=color)
    return ax.scatter(theta, r, c=color),


def simulate():
    anim = animation.FuncAnimation(fig, animate,
                               frames=numFrames, interval=10, blit=True, repeat=False)

    plt.show()

simulate()

提前致谢!

编辑:

我修复了它,使它变成了一个点图,我现在将速度、位置和车道存储在一个对象中,以供以后的问题使用。我的问题是: 如何使点具有不同的颜色?

from matplotlib import pyplot as plt
import random
import math
from matplotlib import animation
import numpy as np
from operator import attrgetter

roadLength    = 100
numFrames     = 200
nlanes = 1
numCars = 20
posss =[]
theta         = []
r             = []
color         = []
probability = 0.5
vmax = 1
flowr = []
cars=[]


class Car:
    def __init__(self, position, velocity, lane):
        self.position = position
        self.velocity = velocity
        self.lane = lane






def pos(car,k):
    rand = random.uniform(0,1)
    if car[k].velocity < vmax:
        car[k].velocity +=  1
    if k < numCars-1 and (car[k+1].position - car[k].position) <= car[k].velocity:
        car[k].velocity = car[k+1].position - car[k].position - 1
    if k == numCars-1 and (roadLength - (car[k].position - car[0].position)) <= car[k].velocity:
        car[k].velocity = roadLength - (car[k].position - car[0].position) - 1

    if rand < probability and car[k].velocity > 0:
        car[k].velocity = car[k].velocity - 1
    car[k].position = car[k].position + car[k].velocity
    return car[k].position

for i in range(numCars):
    cars.append(Car(i, 0, 1))
    theta.append(0)
    r.append(1)
    color.append(i)
    posss.append(i)

fig = plt.figure()
ax = fig.add_subplot(111)
point, = ax.plot(posss, r, 'o')
ax.set_xlim(-10, 1.2*numFrames)
ax.set_ylim(-2, nlanes + 3)

def animate(frameNr):
    sort_cars = sorted(cars, key=attrgetter("position"))
    for i in range(numCars):
        pos(sort_cars,i)
    for k in range(numCars):
        theta[k]=cars[k].position


    point.set_data(theta, r)
    return point,


def simulate():
    anim = animation.FuncAnimation(fig, animate,
                               frames=numFrames, interval=10, blit=True, repeat=False)

    plt.show()

simulate()

【问题讨论】:

    标签: python matplotlib animation simulation


    【解决方案1】:

    plot() 返回一个Line2D 对象,其中所有点的颜色相同。

    如果你想让你的点有不同的颜色,你应该使用scatter()。逻辑完全一样,只是你使用set_offsets(&lt;2D array&gt;)而不是set_data()

    详情请见this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-04
      • 2016-06-01
      • 2021-05-12
      • 1970-01-01
      • 2021-04-29
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多