无法在Matplotlib中将多个FuncAnimation保存为单个gif

问题描述 投票:0回答:1

我正在尝试在matplotlib中制作3D动画,我希望将我的绘图组合在一起,但是我无法将其另存为gif文件。我制作了两个不同的图,但是无法将它们保存在一个文件中。我该怎么办?

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


fig = plt.figure()
ax = p3.Axes3D(fig)

def gen(n):
    z = 0
    while z < 10:
        yield np.array([0, 10 * np.cos((-18 * np.pi * z) + (2 * np.pi / 3)), z])
        z += 10 / n

def gen1(m):
    z = 0
    while z < 10:
        yield np.array([-5 * np.cos((-18 * np.pi * z) + (2 * np.pi / 3)), 0, z])
        z += 10 / m

def update(num, data, line):
    line.set_data(data[:2, :num])
    line.set_3d_properties(data[2, :num])

N = 100
data = np.array(list(gen(N))).T
line, = ax.plot(data[0, 0:1], data[1, 0:1], data[2, 0:1])

M = 100
data1 = np.array(list(gen1(M))).T
line1, = ax.plot(data1[0, 0:1], data1[1, 0:1], data1[2, 0:1])

# Setting the axes properties
ax.set_xlim3d([-10.0, 10.0])
ax.set_xlabel('X')

ax.set_ylim3d([-10.0, 10.0])
ax.set_ylabel('Y')

ax.set_zlim3d([0.0, 10.0])
ax.set_zlabel('Z')

ani = animation.FuncAnimation(fig, update, N, fargs=(data, line), interval=8000/N, blit=False), animation.FuncAnimation(fig, update, M, fargs=(data1, line1), interval=8000/N, blit=False)
# ani1 = animation.FuncAnimation(fig, update, M, fargs=(data1, line1), interval=8000/N, blit=False)
ani.save('FlatWave.gif', writer='imagemagick')

错误是由于ani对象是一个元组,但我还是找不到将图组合在一起的方法。谢谢!

AttributeError: 'tuple' object has no attribute 'save'
python matplotlib animation 3d
1个回答
0
投票

您应该只具有可以使所有演出者动起来的FuncAnimation对象。

例如:

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

fig = plt.figure()
ax = p3.Axes3D(fig)

def gen(n):
    z = 0
    while z < 10:
        yield np.array([0, 10 * np.cos((-18 * np.pi * z) + (2 * np.pi / 3)), z])
        z += 10 / n

def gen1(m):
    z = 0
    while z < 10:
        yield np.array([-5 * np.cos((-18 * np.pi * z) + (2 * np.pi / 3)), 0, z])
        z += 10 / m

def update(num, data, line):
    line.set_data(data[:2, :num])
    line.set_3d_properties(data[2, :num])

def update_both(num, data1, line1, data2, line2):
    update(num, data1, line1)
    update(num, data2, line2)

N = 100
data = np.array(list(gen(N))).T
line, = ax.plot(data[0, 0:1], data[1, 0:1], data[2, 0:1])

M = 100
data1 = np.array(list(gen1(M))).T
line1, = ax.plot(data1[0, 0:1], data1[1, 0:1], data1[2, 0:1])

# Setting the axes properties
ax.set_xlim3d([-10.0, 10.0])
ax.set_xlabel('X')

ax.set_ylim3d([-10.0, 10.0])
ax.set_ylabel('Y')

ax.set_zlim3d([0.0, 10.0])
ax.set_zlabel('Z')

ani = animation.FuncAnimation(fig, update_both, N, fargs=(data, line, data1, line1), interval=8000/N, blit=False)
ani.save('FlatWave.gif', writer='imagemagick')
© www.soinside.com 2019 - 2024. All rights reserved.