python - 无法在 Matplotlib 中将多个 FuncAnimation 保存为单个 gif
问题描述
我正在尝试在 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'
解决方案
您应该只拥有可以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')
推荐阅读
- java - 有没有办法在 android 的可绘制矢量中移动(翻译)一个组?
- r - 使用来自各种来源的 R igraph all_simple_paths 并逐步构建 Origin Destination 路径
- r - 菜鸟 q:如何绘制 R Shiny sliderInputs
- android - Android:在 Chrome 自定义选项卡中加载自己的样式表
- git - 为什么你会隐藏更改而不是创建本地提交或临时分支?
- css - 样式化组件覆盖父道具类型
- graphql - GraphQL 字段解析器永远不会被调用
- jupyter-contrib-nbextensions - jupyter notebook 中不完整的 nbextensions(仅显示 5 个扩展)
- python - 用对象在现有绘图上添加 3d 点
- mysql - 在 MySQL 过程中获取给定父节点的所有子节点(及其子节点)