1

I am trying to save an animation with a completely transparent background. Setting:

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

Does not seem to work. Also, just as a side note, if you do that and view the plot then you get these weird transparency effects and lagging animation. Curious why that happens too, but mostly I just want the background to save as transparent.

If I then try:

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

Then I get an output which does not have a transparent background and makes the lines thick. Same curiosity as above as why making the figure alpha to 0 would give this effect.

Another attempt:

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

Also doesn't produce a transparent background.

If I just include the facecolor in the dictionary, then it gives the undesired line thickening bug.

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

The code is below.

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

If you run the code it should show you the animation and then save it. It also will calculate the runtime.

  • Possible bug in saving transparent background in animations. A work around is proposed here: https://stackoverflow.com/questions/38406617/mplot3d-animation-with-transparent-background – SKPS Feb 13 '20 at 03:15
  • Does this answer your question? [mplot3d animation with transparent background](https://stackoverflow.com/questions/38406617/mplot3d-animation-with-transparent-background) – SKPS Feb 13 '20 at 03:15
  • I'm trying to adapt it to the 2D case as we speak. For now it just exports a blank gif. Possibly my plotting is incorrect. Will update on my progress. –  Feb 13 '20 at 09:29

1 Answers1

1

Setting transparent = True does the trick...

line_ani.save('lines1.gif', writer='imagemagick',savefig_kwargs={"transparent": True})
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Dec 08 '22 at 10:37