Python:使用mplot3d和动画设置向量动画

Python:使用mplot3d和动画设置向量动画,python,qt,animation,matplotlib,Python,Qt,Animation,Matplotlib,我正在尝试使用Matplotlib和Matplotlib的动画包制作3d绘图。此外,动画应该是使用PyQt和Qt设计器生成的Gui的一部分。目前,我一直坚持正确使用“animation.functionation()”,至少我认为是这样。。。 这是我的代码: import sys from PyQt4.uic import loadUiType from PyQt4 import QtGui from matplotlib import pyplot as plt from mpl_toolk

我正在尝试使用Matplotlib和Matplotlib的动画包制作3d绘图。此外,动画应该是使用PyQt和Qt设计器生成的Gui的一部分。目前,我一直坚持正确使用“animation.functionation()”,至少我认为是这样。。。 这是我的代码:

import sys
from PyQt4.uic import loadUiType
from PyQt4 import QtGui

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib import animation

import numpy as np
import Quaternion as qt

Ui_MainWindow, QMainWindow = loadUiType('Newsphere.ui')

class Kinematic(Ui_MainWindow, QMainWindow):
    def __init__(self):
        super(Kinematic, self).__init__()
        self.setupUi(self)

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

        self.ani = animation.FuncAnimation(self.fig, self.update,
                                       init_func=self.setup_plot, blit=True)

        self.canvas = FigureCanvas(self.fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()

    def setup_plot(self):
        self.ax.view_init(40, 45)

        self.ax.set_xlabel('X')
        self.ax.set_ylabel('Y')
        self.ax.set_zlabel('Z')

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

        g_x = np.matrix([[1.0],[0.0],[0.0]])
        g_y = np.matrix([[0.0],[1.0],[0.0]])
        g_z = np.matrix([[0.0],[0.0],[1.0]])

        self.ax.plot([0,g_x[0]], [0,g_x[1]], [0,g_x[2]], label='$X_0$')
        self.ax.plot([0,g_y[0]], [0,g_y[1]], [0,g_y[2]], label='$Y_0$')
        self.ax.plot([0,g_z[0]], [0,g_z[1]], [0,g_z[2]], label='$Z_0$')

        self.vek, = self.ax.plot([0,-1], [0,0], [0,0], label='$g \cdot R$', animated=True)

        self.ax.legend(loc='best')
        self.ax.scatter(0,0,0, color='k')

        return self.vek,

    def update(self, i):
        b = self.bslider.value() / 100

        g = np.matrix([[1.0],[0.0],[0.0]])
        q = np.array([0,b,0.5,0])

        R = qt.QtoR(q)
        x, y, z = R*g

        self.vek, = self.ax.plot([0,x], [0,y], [0,z], label='$g \cdot R$', animated=True) #the rotated vector
        return self.vek,

if __name__ == '__main__':

app = QtGui.QApplication(sys.argv)

main = Kinematic()
main.show()

sys.exit(app.exec_())
由于没有文件“Newsphere.ui”(第13行)和Quaternion.py(第11行),因此仅通过复制粘贴无法运行它。因此,当我运行它时,我得到以下结果(实际上就像我希望的那样!):


现在,我的目标是绘制一个向量(第50行)并使用从Gui滑块(第58行)获取的数据为其设置动画(第66行)。有人能帮我吗?这件事我已经坚持了好几天了

由于您的问题在于动画部分,下面您可以看到一个片段,用于为旋转的箭头设置动画

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


def data_gen(num):
    """Data generation"""
    angle = num * np.pi/36    
    vx, vy, vz = np.cos(angle), np.sin(angle), 1
    ax.cla()
    ax.quiver(0, 0, 0, vx, vy, vz, pivot="tail", color="black")
    ax.quiver(0, 0, 0, vx, vy, 0, pivot="tail", color="black",
              linestyle="dashed")
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    ax.set_zlim(-1, 1)
    ax.view_init(elev=30, azim=60)


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
data_gen(0)
ani = animation.FuncAnimation(fig, data_gen, range(72), blit=False)
plt.show()

关于动画的文档可能不是最好的。但是这里有几个例子,例如,这一个动画。由于您的问题是动画部分,下面您可以看到一个片段,它为旋转的箭头设置动画

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


def data_gen(num):
    """Data generation"""
    angle = num * np.pi/36    
    vx, vy, vz = np.cos(angle), np.sin(angle), 1
    ax.cla()
    ax.quiver(0, 0, 0, vx, vy, vz, pivot="tail", color="black")
    ax.quiver(0, 0, 0, vx, vy, 0, pivot="tail", color="black",
              linestyle="dashed")
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    ax.set_zlim(-1, 1)
    ax.view_init(elev=30, azim=60)


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
data_gen(0)
ani = animation.FuncAnimation(fig, data_gen, range(72), blit=False)
plt.show()

关于动画的文档可能不是最好的。但是有几个例子,例如,这一个是动画。

因此,如果有人对所提到的问题的解决方案感兴趣,我们就这样做:(同样,由于缺少“Newsphere.ui”,它不是复制粘贴的代码,但我试着解释重要的片段)

通过运行我得到的代码

(这是两张合二为一的图片,显示了相同的过程)

我在下面生成了一个名为
Newsphere.ui
的GUI文件。基本上,它只包含一个小部件、一个QSlider和一个QSpinBox。小部件的布局名称为“mplvl”,出现在第41行。这会将生成的图形添加到小部件中(我想是的…)。QSlider与QSpinBox连接(在QtDesigner中完成),并具有名称“bslider”,第55行。所以在这一行中,滑块值除以100,因为我没有找到一个可以生成浮点值的滑块。对我来说,关键的一行是第61行,画画布的地方。现在,
animation.FuncAnimation
(第43行)在我更改滑块值时绘制一个新向量,比较图片。同样重要的是将变化向量绘制为
ax.quivel
,而不是像我之前尝试的那样绘制为
ax.plot


如果有问题或改进建议,请询问/发布。

因此,如果有人对所述问题的解决方案感兴趣,我们开始:(由于缺少“Newsphere.ui”,这不是复制粘贴的代码,但我尝试解释重要的片段)

通过运行我得到的代码

(这是两张合二为一的图片,显示了相同的过程)

我在下面生成了一个名为
Newsphere.ui
的GUI文件。基本上,它只包含一个小部件、一个QSlider和一个QSpinBox。小部件的布局名称为“mplvl”,出现在第41行。这会将生成的图形添加到小部件中(我想是的…)。QSlider与QSpinBox连接(在QtDesigner中完成),并具有名称“bslider”,第55行。所以在这一行中,滑块值除以100,因为我没有找到一个可以生成浮点值的滑块。对我来说,关键的一行是第61行,画画布的地方。现在,
animation.FuncAnimation
(第43行)在我更改滑块值时绘制一个新向量,比较图片。同样重要的是将变化向量绘制为
ax.quivel
,而不是像我之前尝试的那样绘制为
ax.plot


如果有任何问题或改进建议,请询问/发布。

请创建一个解决方案,我必须转换我的GUI.ui文件,这将花费太长时间,抱歉。但我发现了,请看下面我的答案!如果这解决了您的问题,请不要忘记接受答案。请创建一个用于执行此操作的,我必须转换我的GUI.ui文件,这将花费太长的时间,抱歉。但我发现了,请看下面我的答案!如果这解决了你的问题,请不要忘记接受答案。谢谢你的回复!在你的代码片段和Lorenz吸引子链接的帮助下,我找到了答案。我会在一个单独的答案中发布我的解决方案…谢谢你的回复!在你的代码片段和Lorenz吸引子链接的帮助下,我找到了答案。我将在一个单独的答案中发布我的解决方案。。。