首页 > 解决方案 > matplotlib 3D 散点动画

问题描述

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(100)
y = np.arange(100)
for t in range(100):
    z = np.ones(100)*t
fig = plt.figure(dpi=1200)
ax = fig.add_subplot(projection='3d')
ax.scatter(x,y,z)

我想根据t. 例如(x[0], y[0], z),当 t = 0 时首先绘图。然后 (x[1], y[1],z)当 t = 1 时,等等。但是,一旦新点显示,以前的点就会消失。请问我怎样才能做到这一点?谢谢你。另外,如果我 ax.scatter改为ax.plot_surface,请问我将如何实现相同的目标?谢谢。

标签: pythonmatplotlibanimationplotvisualization

解决方案


我重新构建了您的代码以播放动画。
首先,您需要定义一个函数update,您想要从一帧更改为下一帧的内容将被更新。在我们的例子中,在update函数 I updatex和基于参数y的坐标。然后我清除以前的图并用更新的坐标绘制一个新的图。最后,设置轴限制很方便,以保持动画帧固定。zt

def update(t):
    ax.cla()

    x = np.cos(t/10)
    y = np.sin(t/10)
    z = 5

    ax.scatter(x, y, z, s = 100, marker = 'o')

    ax.set_xlim(-2, 2)
    ax.set_ylim(-2, 2)
    ax.set_zlim(-1, 10)

然后创建一个图形和一个FuncAnimation实例,向其传递播放动画的图形、update函数和其他重要参数,如帧数、它们之间的间隔等。有关详细信息,请参阅文档

fig = plt.figure(dpi=100)
ax = fig.add_subplot(projection='3d')

ani = FuncAnimation(fig = fig, func = update, frames = 100, interval = 100)

plt.show()

完整代码

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation


def update(t):
    ax.cla()

    x = np.cos(t/10)
    y = np.sin(t/10)
    z = 5

    ax.scatter(x, y, z, s = 100, marker = 'o')

    ax.set_xlim(-2, 2)
    ax.set_ylim(-2, 2)
    ax.set_zlim(-1, 10)


fig = plt.figure(dpi=100)
ax = fig.add_subplot(projection='3d')

ani = FuncAnimation(fig = fig, func = update, frames = 100, interval = 100)

plt.show()

在此处输入图像描述


如果您还想跟踪粒子轨迹,可以添加X,YZ列出保存粒子坐标的位置:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation


X = []
Y = []
Z = []


def update(t):
    ax.cla()

    x = np.cos(t/10)
    y = np.sin(t/10)
    z = t/10

    X.append(x)
    Y.append(y)
    Z.append(z)

    ax.scatter(x, y, z, s = 100, marker = 'o')
    ax.plot(X, Y, Z)

    ax.set_xlim(-2, 2)
    ax.set_ylim(-2, 2)
    ax.set_zlim(-1, 10)


fig = plt.figure(dpi=100)
ax = fig.add_subplot(projection='3d')

ani = FuncAnimation(fig = fig, func = update, frames = 100, interval = 100, repeat = False)

plt.show()

在此处输入图像描述


推荐阅读