无法保存具有透明背景的动画gif(matplotlib.animation)

时间:2020-02-12 23:28:55

标签: python matplotlib animation

我正在尝试保存具有完全透明背景的动画。设置:

fig1 = (...,facecolor=(1,1,1,0))

似乎无效。另外,作为一个旁注,如果您这样做并查看绘图,则会得到这些奇怪的透明效果和滞后的动画。很好奇为什么也会发生这种情况,但是大多数情况下,我只希望背景保存为透明。

如果我再尝试:

line_ani.save('lines1.gif', writer='imagemagick',savefig_kwargs={"facecolor": (1,1,1,0)})

然后我得到一个不具有透明背景的输出,并使线变粗。与上面的好奇一样,为什么将图形的alpha设置为0也会产生这种效果。

另一种尝试:

fig1 = (...,facecolor=(1,1,1,0))
line_ani.save(...,savefig_kwargs={"transparent": None})

也不会产生透明背景。

如果我只在字典中包含facecolor,那么它会给出不希望有的线条加粗错误。

line_ani.save(...,savefig_kwargs={"transparent": None,"facecolor":(1,1,1,0)})

代码在下面。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
from matplotlib.pyplot import figure

def update_line(num, data, line):
    line.set_data(data[..., :num])
    return line,

def plots():
    plt.xlim(-1, 1)
    plt.ylim(-1, 1)
    plt.xticks([])
    plt.yticks([])
    plt.box()

# Since I'm calling things twice, it's convenient to define these
fs = (3,3)
inter = 100
frames = 219
lw = 0.25
alph = 0

fig1 = plt.figure(figsize=fs)
l, = plt.plot([], [],'r',linewidth =lw)

# Generate placeholder for data and set initial conditions
DAT =np.zeros((2,300))
DAT[0][0] = 0
DAT[1][0] = 1

theta=2*np.pi*(1/np.e +0.01)

# 2D Rotation Matrix
def R(x):
    return [[np.cos(x),-np.sin(x)],[np.sin(x),np.cos(x)]]

# Generate the data
for i in range(len(DAT[0])):
    if i < len(DAT[0])-1:
        DAT[0][i+1]=DAT[0][i]*R(theta)[0][0] + DAT[1][i]*R(theta)[0][1]
        DAT[1][i+1]=DAT[0][i]*R(theta)[1][0] + DAT[1][i]*R(theta)[1][1]

# Animate the data
plots()
line_ani = animation.FuncAnimation(fig1, update_line, frames, fargs=(DAT, l),
                                   interval=inter, blit=True,repeat_delay = 2000)
plt.show()

# Save the animation
matplotlib.use("Agg")

fig1 = plt.figure(figsize=fs)
l, = plt.plot([], [],'r',linewidth = lw)
plots()
line_ani = animation.FuncAnimation(fig1, update_line, frames, fargs=(DAT, l),
                                   interval=inter, blit=True,repeat_delay = 2000)
print("Saving animation...")
now=time.time()
line_ani.save('lines1.gif', writer='imagemagick',savefig_kwargs={"transparent": None})
later = time.time()
print("Saved in time: ", int(later-now),"seconds")

如果运行代码,它应该向您显示动画,然后保存它。它还将计算运行时间。

0 个答案:

没有答案