Не удается сохранить анимированный GIF с прозрачным фоном (matplotlib.animation) - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь сохранить анимацию с полностью прозрачным фоном. Настройка:

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

Не похоже на работу. Кроме того, если вы сделаете это и просмотрите график, вы получите эти странные эффекты прозрачности и запаздывающую анимацию. Любопытно, почему это тоже происходит, но в основном я просто хочу, чтобы фон был сохранен как прозрачный.

Если я тогда попробую:

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

Тогда я получаю вывод, который не имеет прозрачного фона и делает линии толстыми. Тот же интерес, что и выше, объясняет, почему если сделать цифру альфа равной 0. Это даст эффект.

Еще одна попытка:

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

Также не дает прозрачного фона.

Если я просто включу цвет лица в словарь, то он выдаст нежелательную ошибку сгущения линии.

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")

Если вы запустите код, который должен показать анимацию, а затем сохраните его. Он также рассчитает время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...