Python 使用matplotlib制作三维移动散点图

Python 使用matplotlib制作三维移动散点图,python,matplotlib,Python,Matplotlib,我想在matplotlib中从现有的二维打印生成三维打印在二维绘图中,有一些点在圆内随机移动。现在我已经把轴做成了3D,就我所见,这些点也在3D位置。但它们没有移动,我收到一条错误消息:“ValueError:太多的值无法解压缩(预期为2)”我没有找到出错的地方(我猜程序仍然只需要x,y坐标)你能帮我吗 from matplotlib import animation import random from mpl_toolkits.mplot3d import Axes3D from matpl

我想在matplotlib中从现有的二维打印生成三维打印
在二维绘图中,有一些点在圆内随机移动。现在我已经把轴做成了3D,就我所见,这些点也在3D位置。但它们没有移动,我收到一条错误消息:“ValueError:太多的值无法解压缩(预期为2)”
我没有找到出错的地方(我猜程序仍然只需要x,y坐标)
你能帮我吗

from matplotlib import animation
import random
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot
import numpy as np
import matplotlib.pyplot as plt

def get_initial_coordinates():
    x_coord =[random.uniform(3, 7) for i in range(n_particles)]
    y_coord = [random.uniform(3, 7) for i in range(n_particles)]
    z_coord = [random.uniform(3, 7) for i in range(n_particles)]
    return x_coord, y_coord, z_coord

def get_initial_velocities():
    x_vel = [3 * (np.random.random() - 0.5) * box_width for i in range(n_particles)]
    y_vel = [3 * (np.random.random() - 0.5) * box_width for i in range(n_particles)]
    z_vel = [3 * (np.random.random() - 0.5) * box_width for i in range(n_particles)]
    return x_vel, y_vel, z_vel

def take_step(x_coord, y_coord, z_coord, x_vel, y_vel, z_vel):
    for i in range(n_particles):
     x_coord[i] += x_vel[i]*dt
     y_coord[i] += y_vel[i]*dt
     z_coord[i] += z_vel[i]*dt

    return x_coord, y_coord,z_coord, x_vel, y_vel,z_vel

n_particles = 40
box_width = 10
n_steps = 5000
dt = 0.001

x_coord, y_coord, z_coord = get_initial_coordinates()
x_vel, y_vel, z_vel = get_initial_velocities()
for i in range(n_steps):
    x_coord,y_coord,z_coord,x_vel,y_vel,z_vel= take_step(x_coord,y_coord,z_coord,x_vel,y_vel,z_vel)
#---------------------
fig = pyplot.figure()
ax= Axes3D(fig)
d, = ax.plot([x_coord[i] for i in range(n_particles)],
             [y_coord[i] for i in range(n_particles)],
             [z_coord[i] for i in range(n_particles)], 'ro')
x_coord, y_coord, z_coord = get_initial_coordinates()
x_vel, y_vel, z_vel = get_initial_velocities()
circle = plt.Circle((5, 5), 3, color='blue', fill=False)
ax.add_artist(circle)

def animate(i):
    take_step(x_coord, y_coord, z_coord, x_vel, y_vel, z_vel)
    d.set_data([x_coord[i]for i in range(n_particles)],
               [y_coord[i]for i in range(n_particles)],
               [z_coord[i]for i in range(n_particles)])
    return d,

anim = animation.FuncAnimation(fig, animate, frames=200, interval=20)
pyplot.show()
set_data()
是从
Line2D
输入的,因此它只能包含两个列表,一个用于x,一个用于y。必须为z组件使用
.set_3d_properties()

def animate(i):
    take_step(x_coord, y_coord, z_coord, x_vel, y_vel, z_vel)
    d.set_data([x_coord[i]for i in range(n_particles)],
               [y_coord[i]for i in range(n_particles)],
               )
    d.set_3d_properties([z_coord[i]for i in range(n_particles)])
    return d,