【问题标题】:Animate a segment in a 3d space为 3d 空间中的片段设置动画
【发布时间】:2014-12-11 16:56:47
【问题描述】:

我得到了一个 .dat 文件,其中包含 3d 空间中段的坐标。 该文件有几行,每一行代表特定时间的位置。

我试过这段代码:

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

dati = np.loadtxt('dati.dat')
t=0
p1=[dati[t,1],dati[t,2],dati[t,3]]
p2=[dati[t,4],dati[t,5],dati[t,6]]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

seg,=ax.plot(p1,p2)

def updateFigure(t,dati,seg):
    p1=[dati[t,1],dati[t,2],dati[t,3]]
    p2=[dati[t,4],dati[t,5],dati[t,6]]
    seg.set_data(p1,p2)
    return seg,

ani=animation.FuncAnimation(fig, updateFigure,iMax, fargs=(dati,seg), interval=100, blit=True)
plt.show()

程序不报错但人形不动。 相同的代码,稍作修改,在 2d 空间中有效..

【问题讨论】:

  • 您应该提供您的数据文件 (dati.dat)。否则人们无法运行您的代码。

标签: python animation matplotlib


【解决方案1】:

您可以直接设置seg._verts3d,而不是调用set_data,但请注意,操作私有变量_verts3d 依赖于实现细节,而不是Line3D 公共接口的一部分:

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

iMax = N = 500
theta = np.linspace(0, 6*np.pi, N)
x = np.cos(theta)
y = np.sin(theta)
z = np.linspace(0, 1, N)
step = 10
dati = np.column_stack(
    [theta, x, np.roll(x, -step), np.roll(x, -2*step)
     , y, np.roll(y, -step), np.roll(y, -2*step)
     , z, np.roll(z, -step), np.roll(z, -2*step)])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
seg, = plt.plot([], [])

ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(0, 1)

def init():
    return seg,

def updateFigure(t):
    p1 = dati[t, 1:4]
    p2 = dati[t, 4:7]
    p3 = dati[t, 7:10]
    seg._verts3d = (p1, p2, p3)
    return seg,

ani = animation.FuncAnimation(
    fig, updateFigure
    , init_func=init
    , frames=iMax
    , interval=5, blit=True)
plt.show()

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多