首页 > 解决方案 > 为什么动画情节提供的情节与静态情节不同

问题描述

早上好,

我通过在 10 个不同的时间步连接 6 个节点坐标来创建动画。

我从一个测试开始:我首先创建一个等于 2 的时间(例如)的静态图,然后我得到了我期望的确切静态图:所有且只有连续节点被连接。

然后我创建动画。不幸的是,动画情节以错误的方式连接节点。可以看到动画连接了连续的节点,也连接了第二个和倒数第二个节点。

知道为什么吗?谢谢

import matplotlib.animation as animation
import numpy as np
import matplotlib.pyplot as plt
import pathlib
import numpy as np
import sympy as sp
from sympy.matrices import Matrix
from sympy import *
import scipy
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

XrevIn ={0: np.array([0., 0., 0., 0., 0., 0.]), 1: np.array([ 0.00000000e+00,  5.55359908e-04, -3.01575613e-03,  1.60258981e-16,
       -1.88004554e-04,  2.09716270e-03]), 2: np.array([ 0.00000000e+00,  1.88126596e-03, -1.05864905e-02, -5.58856185e-16,
       -4.70983730e-04,  7.78577515e-03]), 3: np.array([ 0.00000000e+00,  3.07636263e-03, -1.87148693e-02, -5.14379270e-15,
       -1.31916812e-04,  1.52415555e-02]), 4: np.array([ 0.00000000e+00,  3.58779033e-03, -2.46245242e-02, -1.47128149e-14,
        1.16749245e-03,  2.24516459e-02]), 5: np.array([ 0.00000000e+00,  3.59200704e-03, -2.82502801e-02, -2.68351002e-14,
        3.02481425e-03,  2.74174357e-02]), 6: np.array([ 0.00000000e+00,  3.61539600e-03, -3.07970908e-02, -3.72823119e-14,
        4.66788533e-03,  2.80947705e-02]), 7: np.array([ 0.00000000e+00,  4.03493648e-03, -3.35061989e-02, -4.36533446e-14,
        5.62638096e-03,  2.43037541e-02]), 8: np.array([ 0.00000000e+00,  4.51964999e-03, -3.52398245e-02, -4.74131398e-14,
        6.20457916e-03,  1.67064087e-02]), 9: np.array([ 0.00000000e+00,  4.38242376e-03, -3.39748202e-02, -5.25545111e-14,
        7.17612086e-03,  7.36607871e-03])}
XrevFin ={0: np.array([0., 0., 0., 0., 0., 0.]), 1: np.array([ 5.55359908e-04, -3.01575613e-03,  1.60258981e-16, -1.88004554e-04,
        2.09716270e-03,  0.00000000e+00]), 2: np.array([ 1.88126596e-03, -1.05864905e-02, -5.58856185e-16, -4.70983730e-04,
        7.78577515e-03,  0.00000000e+00]), 3: np.array([ 3.07636263e-03, -1.87148693e-02, -5.14379270e-15, -1.31916812e-04,
        1.52415555e-02,  0.00000000e+00]), 4: np.array([ 3.58779033e-03, -2.46245242e-02, -1.47128149e-14,  1.16749245e-03,
        2.24516459e-02,  0.00000000e+00]), 5: np.array([ 3.59200704e-03, -2.82502801e-02, -2.68351002e-14,  3.02481425e-03,
        2.74174357e-02,  0.00000000e+00]), 6: np.array([ 3.61539600e-03, -3.07970908e-02, -3.72823119e-14,  4.66788533e-03,
        2.80947705e-02,  0.00000000e+00]), 7: np.array([ 4.03493648e-03, -3.35061989e-02, -4.36533446e-14,  5.62638096e-03,
        2.43037541e-02,  0.00000000e+00]), 8: np.array([ 4.51964999e-03, -3.52398245e-02, -4.74131398e-14,  6.20457916e-03,
        1.67064087e-02,  0.00000000e+00]), 9: np.array([ 4.38242376e-03, -3.39748202e-02, -5.25545111e-14,  7.17612086e-03,
        7.36607871e-03,  0.00000000e+00])}
YrevIn= {0: np.array([0.        , 0.16666667, 0.33333333, 0.5       , 0.66666667,
       0.83333333]), 1: np.array([0.        , 0.16666667, 0.3338049 , 0.50357479, 0.66666667,
       0.83326732]), 2: np.array([0.        , 0.16666667, 0.33505893, 0.5112853 , 0.66666667,
       0.83306314]), 3: np.array([0.        , 0.16666667, 0.33664188, 0.51530559, 0.66666667,
       0.83273491]), 4: np.array([0.        , 0.16666667, 0.3381702 , 0.51143456, 0.66666667,
       0.83241501]), 5: np.array([0.        , 0.16666667, 0.33945781, 0.50276058, 0.66666667,
       0.8324297 ]), 6: np.array([0.        , 0.16666667, 0.34040272, 0.49593938, 0.66666667,
       0.83320099]), 7: np.array([0.        , 0.16666667, 0.3410492 , 0.49513911, 0.66666667,
       0.83481925]), 8: np.array([0.        , 0.16666667, 0.34132823, 0.49705117, 0.66666667,
       0.83704576]), 9: np.array([0.        , 0.16666667, 0.34121215, 0.49408055, 0.66666667,
       0.83932395])}
YrevFin ={0: np.array([0.16666667, 0.33333333, 0.5       , 0.66666667, 0.83333333,
       1.        ]), 1: np.array([0.16666667, 0.3338049 , 0.50357479, 0.66666667, 0.83326732,
       1.        ]), 2: np.array([0.16666667, 0.33505893, 0.5112853 , 0.66666667, 0.83306314,
       1.        ]), 3: np.array([0.16666667, 0.33664188, 0.51530559, 0.66666667, 0.83273491,
       1.        ]), 4: np.array([0.16666667, 0.3381702 , 0.51143456, 0.66666667, 0.83241501,
       1.        ]), 5: np.array([0.16666667, 0.33945781, 0.50276058, 0.66666667, 0.8324297 ,
       1.        ]), 6: np.array([0.16666667, 0.34040272, 0.49593938, 0.66666667, 0.83320099,
       1.        ]), 7: np.array([0.16666667, 0.3410492 , 0.49513911, 0.66666667, 0.83481925,
       1.        ]), 8: np.array([0.16666667, 0.34132823, 0.49705117, 0.66666667, 0.83704576,
       1.        ]), 9: np.array([0.16666667, 0.34121215, 0.49408055, 0.66666667, 0.83932395,
       1.        ])}





dt=0.0005

fig = plt.figure()
line1 =plt.plot([XrevIn[2], XrevFin[2]], [YrevIn[2], YrevFin[2]])
plt.show()


fig = plt.figure()
ax = fig.add_subplot(111, autoscale_on=False,xlim=(-0.1, 0.1),  ylim=(-0.1, 1.1))
ax.grid()
line1, =plt.plot([], [])

time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)
def animate(q):  
    line1.set_xdata([XrevIn[q], XrevFin[q]])  
    line1.set_ydata([YrevIn[q], YrevFin[q]])  
    time_text.set_text(str(round((q*dt), 4))+'s')
    return line1, time_text



ani = animation.FuncAnimation(fig, animate, np.arange(1, 10),
                              interval=25, blit=True)
plt.show()

标签: pythonmatplotlibanimation

解决方案


问题是在您的静态图中,您实际上已经创建了一个Line2D对象列表(尝试打印line1,您会看到它不是一个实例)。

但是,在动画函数中,您只需创建一个Line2D实例来设置xdataand ydatafor。

我们可以更改为创建Line2D实例列表,然后遍历它们并为每个段设置适当的 x 和 y 数据,如下所示:

lines = [plt.plot([], [])[0] for i in line1]

time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)
def animate(q):  
    for i, line in enumerate(lines):
        line.set_xdata([XrevIn[q][i], XrevFin[q][i]])  
        line.set_ydata([YrevIn[q][i], YrevFin[q][i]])  
    time_text.set_text(str(round((q*dt), 4))+'s')
    return lines + [time_text]

在此处输入图像描述


推荐阅读