将动画 Matplotlib 图形保存为 GIF 文件会产生不同的图形
Saving an animated Matplotlib graph as a GIF file results in a different looking plot
我使用来自 Matplotlib 动画 class 的 FuncAnimation
创建了一个动画图,我想将其保存为 .gif 文件。当我 运行 脚本时,输出看起来很正常,看起来像这样(动画效果很好):
但是,当我尝试使用 ImageMagick 或 PillowWriter 将动画情节保存为 .gif 文件时,情节如下图所示:
线条明显粗了很多,总的来说,就是很不好看。问题归因于点(紫色和红色圆圈)。因此,似乎情节正在写在每一帧上(我认为是这种情况)。我可以通过一起摆脱它们来避免这种情况。但我不想那样做,因为很难看到线条。
代码如下:
line, = ax.plot([], [], color = 'blue', lw=1)
line2, = ax.plot([], [], color = 'red', lw=1)
line3, = ax.plot([], [], color = 'purple', lw=1)
def animate(i):
line.set_data(x1[:i], y1[:i])
line2.set_data(x2[:i], y2[:i])
line3.set_data(x3[:i], y3[:i])
point1, = ax.plot(x1[i], y1[i], marker='.', color='blue')
point2, = ax.plot(x2[i], y2[i], marker='.', color='red')
point3, = ax.plot(x3[i], y3[i], marker='.', color='purple')
return line, line2, line3, point1, point2, point3,
ani = animation.FuncAnimation(fig, animate, interval=20, blit=True, repeat=False, frames=1000, save_count=1000)
ani.save("TLI.gif", writer='imagemagick',fps=60)
数组x1, y1, x2, y2, x3, y3
都是包含x、y坐标的一维数组。
那么为什么会这样呢?为什么我直接 运行 .gif 文件不显示绘图显示的内容?还有,我该如何解决这个问题?
我也知道这个 Stack Overflow 问题: 这意味着问题肯定归因于 blitting。但是,阅读该问题的答案并没有解决我的问题,因为它仅指 ax.text
而不是通过 ax.plot
.
绘制的常规点
看看这是否有效。我没有 Imagemagick,所以我使用了 Pillow。
为了防止动画显示堆叠帧(即点轨迹),技巧是清除轴以刷新每一帧。然后为每一帧设置 xlim
和 ylim
,并使用 ax.plot(x1[0:i], y1[0:i]...
绘制增量线
要提高图像分辨率,请将输出dpi设置为合适的值。我玩弄它并确定为 300 以获得清晰的线条和轴 lines/numbers。
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter
import numpy as np
x1 = np.arange(0, -0.2, -0.002)
y1 = np.arange(0, -0.2, -0.002)
x2 = np.arange(3.9, 3.7, -0.002)
y2 = np.arange(0, 1, 0.01)
x3 = np.arange(0, 1.8, 0.018)
y3 = np.array(x3**2)
fig,ax = plt.subplots()
def animate(i):
ax.clear()
ax.set_xlim(-4,4)
ax.set_ylim(-4,4)
line, = ax.plot(x1[0:i], y1[0:i], color = 'blue', lw=1)
line2, = ax.plot(x2[0:i], y2[0:i], color = 'red', lw=1)
line3, = ax.plot(x3[0:i], y3[0:i], color = 'purple', lw=1)
point1, = ax.plot(x1[i], y1[i], marker='.', color='blue')
point2, = ax.plot(x2[i], y2[i], marker='.', color='red')
point3, = ax.plot(x3[i], y3[i], marker='.', color='purple')
return line, line2, line3, point1, point2, point3,
ani = FuncAnimation(fig, animate, interval=40, blit=True, repeat=True, frames=100)
ani.save("TLI.gif", dpi=300, writer=PillowWriter(fps=25))
我使用来自 Matplotlib 动画 class 的 FuncAnimation
创建了一个动画图,我想将其保存为 .gif 文件。当我 运行 脚本时,输出看起来很正常,看起来像这样(动画效果很好):
但是,当我尝试使用 ImageMagick 或 PillowWriter 将动画情节保存为 .gif 文件时,情节如下图所示:
线条明显粗了很多,总的来说,就是很不好看。问题归因于点(紫色和红色圆圈)。因此,似乎情节正在写在每一帧上(我认为是这种情况)。我可以通过一起摆脱它们来避免这种情况。但我不想那样做,因为很难看到线条。
代码如下:
line, = ax.plot([], [], color = 'blue', lw=1)
line2, = ax.plot([], [], color = 'red', lw=1)
line3, = ax.plot([], [], color = 'purple', lw=1)
def animate(i):
line.set_data(x1[:i], y1[:i])
line2.set_data(x2[:i], y2[:i])
line3.set_data(x3[:i], y3[:i])
point1, = ax.plot(x1[i], y1[i], marker='.', color='blue')
point2, = ax.plot(x2[i], y2[i], marker='.', color='red')
point3, = ax.plot(x3[i], y3[i], marker='.', color='purple')
return line, line2, line3, point1, point2, point3,
ani = animation.FuncAnimation(fig, animate, interval=20, blit=True, repeat=False, frames=1000, save_count=1000)
ani.save("TLI.gif", writer='imagemagick',fps=60)
数组x1, y1, x2, y2, x3, y3
都是包含x、y坐标的一维数组。
那么为什么会这样呢?为什么我直接 运行 .gif 文件不显示绘图显示的内容?还有,我该如何解决这个问题?
我也知道这个 Stack Overflow 问题:ax.text
而不是通过 ax.plot
.
看看这是否有效。我没有 Imagemagick,所以我使用了 Pillow。
为了防止动画显示堆叠帧(即点轨迹),技巧是清除轴以刷新每一帧。然后为每一帧设置 xlim
和 ylim
,并使用 ax.plot(x1[0:i], y1[0:i]...
要提高图像分辨率,请将输出dpi设置为合适的值。我玩弄它并确定为 300 以获得清晰的线条和轴 lines/numbers。
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter
import numpy as np
x1 = np.arange(0, -0.2, -0.002)
y1 = np.arange(0, -0.2, -0.002)
x2 = np.arange(3.9, 3.7, -0.002)
y2 = np.arange(0, 1, 0.01)
x3 = np.arange(0, 1.8, 0.018)
y3 = np.array(x3**2)
fig,ax = plt.subplots()
def animate(i):
ax.clear()
ax.set_xlim(-4,4)
ax.set_ylim(-4,4)
line, = ax.plot(x1[0:i], y1[0:i], color = 'blue', lw=1)
line2, = ax.plot(x2[0:i], y2[0:i], color = 'red', lw=1)
line3, = ax.plot(x3[0:i], y3[0:i], color = 'purple', lw=1)
point1, = ax.plot(x1[i], y1[i], marker='.', color='blue')
point2, = ax.plot(x2[i], y2[i], marker='.', color='red')
point3, = ax.plot(x3[i], y3[i], marker='.', color='purple')
return line, line2, line3, point1, point2, point3,
ani = FuncAnimation(fig, animate, interval=40, blit=True, repeat=True, frames=100)
ani.save("TLI.gif", dpi=300, writer=PillowWriter(fps=25))