动画随机步行3D [Python]



我正在编码一个可以在3D中随机步行的函数,但不幸的是,代码无法正常工作。地块在哪里,没有发生错误,但什么也不会发生。我正在使用%matplotlib tk
有我的代码:

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation
def path_generator(steps, step):
    path = np.empty((3, steps))
    for i in range(1, steps):
        x_ran, y_ran, z_ran = np.random.rand(3)
        sgnX = (x_ran - 0.5)/abs(x_ran - 0.5)
        sgnY = (y_ran - 0.5)/abs(y_ran - 0.5)
        sgnZ = (z_ran - 0.5)/abs(z_ran - 0.5)
        dis = np.array([step*sgnX, step*sgnY, step*sgnZ])
        path[:, i] = path[:, i - 1] + dis
    return path
def animate(i):
    global particles, trajectories
    for trajectory, particle in zip(trajectories, particles):
    trajectory.set_data(particle[0:2, :i])
    trajectory.set_3d_properties(particle[2, :i])  
return trajectories
def random_walk_3D_animated(n, traj = 1):
    fig = plt.figure()
    ax = p3.Axes3D(fig)
    particles = [path_generator(n, 1) for i in range(traj)]
    trajectories = [ax.plot(particle[0, 0:1], particle[1, 0:1], particle[2, 
                    0:1])[0] for particle in particles]
    ax.set_xlim3d([-100, 100])
    ax.set_ylim3d([-100, 100])
    ax.set_zlim3d([-100, 100])
    animacion = animation.FuncAnimation(fig, animate, 1000, interval=50, 
                                        blit=False)
    plt.show()

什么是奇怪的,当没有函数random_walk_3D_animated(n, traj = 1)并且给出值ntraj的值时,代码确实有效。有时,代码不会从(0,0,0)开始随机步行。我想知道为什么。

  1. 开始位置将是EMTY数组的内容。这可能是任何值,因此在这里并不是真正有用的。而是用零来初始化 path
  2. 您需要返回对动画的引用。从动画文档中:" [..]保持对实例对象的参考至关重要。"

完成示例:

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation
def path_generator(steps, step):
    path = np.zeros((3, steps))
    for i in range(1, steps):
        x_ran, y_ran, z_ran = np.random.rand(3)
        sgnX = (x_ran - 0.5)/abs(x_ran - 0.5)
        sgnY = (y_ran - 0.5)/abs(y_ran - 0.5)
        sgnZ = (z_ran - 0.5)/abs(z_ran - 0.5)
        dis = np.array([step*sgnX, step*sgnY, step*sgnZ])
        path[:, i] = path[:, i - 1] + dis
    return path
def animate(i):
    global particles, trajectories
    for trajectory, particle in zip(trajectories, particles):
        trajectory.set_data(particle[0:2, :i])
        trajectory.set_3d_properties(particle[2, :i])  
def random_walk_3D_animated(n, traj = 1):
    global particles, trajectories
    fig = plt.figure()
    ax = p3.Axes3D(fig)
    particles = [path_generator(n, 1) for i in range(traj)]
    trajectories = [ax.plot(particle[0, 0:1], particle[1, 0:1], particle[2, 
                    0:1])[0] for particle in particles]
    ax.set_xlim3d([-100, 100])
    ax.set_ylim3d([-100, 100])
    ax.set_zlim3d([-100, 100])
    animacion = animation.FuncAnimation(fig, animate, 1000, interval=50, 
                                        blit=False)
    return animacion
ani = random_walk_3D_animated(100, traj = 1)
plt.show()

最新更新