Matplotlib动画空间与时间图

时间:2017-02-09 20:21:39

标签: animation matplotlib plot

我目前正在进行交通拥堵分析,并且想知道是否有办法让这类果酱产生动画。

这个事物的情节从图的下端开始逐渐增长,每一行都是'是一个时间实例。横轴只是在每个点指示每个车辆的位置的道路,并且具有一定的数值​​,它的速度。因此,对不同的速度应用不同的颜色,你会得到一个图表,显示果酱如何在给定的道路中随时间演变。

我的问题是,如何使用matplotlib及时生成每个道路实例的动画以获得这样的情节?

情节是这样的:

我模拟了一段时间具有一定速度的车辆的道路,所以我希望动画显示交通堵塞如何演变的情节......

编辑:

我添加了一些代码以明确我已经在做什么

import numpy as np

from matplotlib import pyplot as plt
from matplotlib import animation, rc

plt.rcParams['animation.ffmpeg_path'] = u'/usr/bin/ffmpeg'

# model params
vmax = 5
lenroad = 50
prob = 0.4

# sim params
numiters = 10

# traffic model
def nasch():
    gaps = np.full(road.shape, -1)
    road_r4 = np.full(road.shape, -1)
    for n,x in enumerate(road):
        if x > -1:
            d = 1
            while road[(n+d) % len(road)] < 0:
                d += 1
            d -= 1
            gaps[n] = d

    road_r1 = np.where(road!=-1, np.minimum(road+1, vmax), -1)
    road_r2 = np.where(road_r1!=-1, np.minimum(road_r1, gaps), -1)
    road_r3 = np.where(road_r2!=-1, np.where(np.random.rand() < prob, np.maximum(road-1, 0), road), -1)
    for n,x in enumerate(road_r3):
        if x > -1:
            road_r4[(n+x) % len(road_r3)] = x

    return road_r4

def plot_nasch(*args):
    road = nasch()
    plot.set_array([road])
    return plot,

# init road
road = np.random.randint(-10, vmax+1, [lenroad])
road = np.where(road>-1, road, -1)

# simulate
fig  = plt.figure()
plot = plt.imshow([road], cmap='Pastel2', interpolation='nearest')
for i in range(numiters):
    ani = animation.FuncAnimation(fig, plot_nasch, frames=100, interval=500, blit=True)
    plt.show()

我得到了下图,只有一条路而不是前一条路底部的每条路:

enter image description here

1 个答案:

答案 0 :(得分:0)

这可能是你想要的,虽然我不确定你为什么要为时间设置动画,因为时间已经是情节中的一个轴。

这里的想法是在一个数组中逐行存储时间步的模拟结果并重新绘制该数组。因此,先前的模拟结果不会丢失。

import numpy as np

from matplotlib import pyplot as plt
from matplotlib import animation, rc

# model params
vmax = 5
lenroad = 50
prob = 0.4

# sim params
numiters = 25

# traffic model
def nasch():
    global road
    gaps = np.full(road.shape, -1)
    road_r4 = np.full(road.shape, -1)
    for n,x in enumerate(road):
        if x > -1:
            d = 1
            while road[(n+d) % len(road)] < 0:
                d += 1
            d -= 1
            gaps[n] = d

    road_r1 = np.where(road!=-1, np.minimum(road+1, vmax), -1)
    road_r2 = np.where(road_r1!=-1, np.minimum(road_r1, gaps), -1)
    road_r3 = np.where(road_r2!=-1, np.where(np.random.rand() < prob, np.maximum(road-1, 0), road), -1)
    for n,x in enumerate(road_r3):
        if x > -1:
            road_r4[(n+x) % len(road_r3)] = x

    return road_r4


def plot_nasch(i):
    print i
    global road
    road = nasch()
    #store result in array
    road_over_time[i+1,:] = road
    # plot complete array
    plot.set_array(road_over_time)


# init road
road = np.random.randint(-10, vmax+1, [lenroad])
road = np.where(road>-1, road, -1)
# initiate array
road_over_time = np.zeros((numiters+1, lenroad))*np.nan
road_over_time[0,:] = road



fig  = plt.figure()
plot = plt.imshow(road_over_time, cmap='Pastel2', interpolation='nearest', vmin=-1.5, vmax=6.5)
plt.colorbar()

ani = animation.FuncAnimation(fig, plot_nasch, frames=numiters, init_func=lambda : 1, interval=400, blit=False, repeat=False)
plt.show()