为啥在尝试使用 Line3D 对象时 matplotlib 3d 动画不起作用

Posted

技术标签:

【中文标题】为啥在尝试使用 Line3D 对象时 matplotlib 3d 动画不起作用【英文标题】:Why are matplotlib 3d animations not working when trying to use Line3D objects为什么在尝试使用 Line3D 对象时 matplotlib 3d 动画不起作用 【发布时间】:2020-10-09 18:13:21 【问题描述】:

我有这个代码:

import matplotlib.pyplot as plt 
import mpl_toolkits.mplot3d.axes3d as plt3d
import mpl_toolkits.mplot3d.art3d as artplt3d
import matplotlib.animation as animation

import numpy as np
import math 

def animateBeta():

    def translate(segment_, xTr_, yTr_, zTr_):
        translationMatrix = np.array([
            [1, 0, xTr_],
            [0, 1, yTr_],
            [0, 0, zTr_]
        ])

        return np.matmul(translationMatrix, segment_)

    def rotate(vec_, xRotate_, yRotate_, zRotate_):
        xMat = np.array([
            [1,0,0],
            [0,math.cos(xRotate_), -math.sin(xRotate_)],
            [0, math.sin(xRotate_), math.cos(xRotate_)]
        ])

        yMat = np.array([
            [math.cos(yRotate_), 0, math.sin(yRotate_)],
            [0, 1, 0],
            [-math.sin(yRotate_), 0, math.cos(yRotate_)]
        ])

        zMat = np.array([
            [math.cos(zRotate_), -math.sin(zRotate_), 0],
            [math.sin(zRotate_), math.cos(zRotate_), 0],
            [0, 0, 1]
        ])

        rotationMatrix = np.matmul(zMat, np.matmul(yMat, xMat))

        return np.matmul(rotationMatrix, vec_)

    segment = [
        [0,0],
        [0,0],
        [1, -1]
    ]

    fig = plt.figure()
    ax = plt3d.Axes3D(fig)
    line, = ax.plot(segment[0], segment[1], zs=segment[2], color = 'b')
    artplt3d.line_2d_to_3d(line)

    print(line.__class__)

    def animate(i):
        s0 = [0,0,1]
        s1 = [0,0,-1]
        s1 = translate(rotate(translate(s1, -s0[0], -s0[1], -s0[2]), -i*(math.pi/180),0,-i*(math.pi/180)), s0[0], s0[1], s0[2])
        segment = np.concatenate((np.reshape(s0, (3,-1)),np.reshape(s1, (3,-1))), axis=1)

        #data = ax.plot(segment[0], segment[1], segment[2], color = 'b')
        line.set_3d_properties(zs=segment[2])
        line.set_data_3d(segment[0], segment[1], segment[2])

    anim = animation.FuncAnimation(fig, animate, interval = 1)
    
    plt.show()

animateBeta()

当使用注释的 data = ax.plot(segment[0], segment[1], segment[2], color = 'b') 行而不是下面的两个时它可以工作,(但我正在努力做到这一点,以便在顶部绘制新行时不会绘制之前的行)。

如果您按原样使用代码,动画看起来很奇怪。

我认为line_2d_to_3d 没有按预期工作,但我不确定。

【问题讨论】:

【参考方案1】:

好的,所以我使用的是 ax.plot 而不是 plot3D,我的印象是使用 ax.plot 时绘制更正确

【讨论】:

以上是关于为啥在尝试使用 Line3D 对象时 matplotlib 3d 动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试使用 MVVM WPF 中的命令修改对象时,为啥在视图模型中出现空错误?

为啥我在尝试重新附加对象时收到 InvalidOperationException

当我尝试在我的代码中使用 re.sub 表达式时,为啥会收到一个名为“预期字符串或类似对象的字节”的错误 [重复]

尝试使用点符号在控制台中记录数据对象但它不起作用,为啥?

为啥我在尝试访问“$comment->users->username”时收到“尝试获取非对象的属性 'username'”?

当我尝试在 .NET Core 中反序列化 FormFile 对象时,为啥会出现奇怪的异常?