Unable to save animated plots in Python: missing propositional argument 'self'


I am writing a Python code in Spyder that produces an animated 2D scatter plot but I encounter a TypeError when I try to save it. I use the following:


where fig.mp4 is an example filename. When I run the code everything works as intended, the plot is produced and fully working, the only issue is that it’s not being saved, instead I get the following error:

TypeError: save() missing 1 required positional argument: 'filename'

I then made the following change:


i.e. I added ‘filename=’ in front of the string to specify that this is indeed the filename, but now I get the following error:

TypeError: save() missing 1 required positional argument: 'self'

I pressed control+I on the save() function and checked its documentation in Spyder’s Help tab. ‘Self’ is mentioned in the definition and, in particular, it appears as the first argument of save():

Definition : save(self, filename, writer=None, fps=None, dpi=None, codec=None, bitrate=None, extra_args=None, metadata=None, extra_anim=None, savefig_kwargs=None, *, progress_callback=None)

but nowhere in the description of the parameters or anywhere else in the documentation is there any mention of ‘self’. I then checked the documentation of save() in the official matplotlib site (in the official matplotlib site but there’s absolutely no mention of any ‘self’ argument there too, not even in the definition.
So, what is ‘self’ and what do I have to add as an input so that I will be able to save my animated plots?

Asked By: Tritalas



In Python, the self keyword is used to refer to the instance of a class within the class definition. When you call a method of a class instance, such as the save() method of the Animation class, Python automatically passes the instance itself as the first argument to the method, which is conventionally called self.

The TypeError you are encountering suggests that the save() method of the Animation class is expecting a first argument that refers to the instance itself, but you are not passing it. This may be due to the way you are creating your Animation object or the way you are calling its save() method.

Here is an example of how to create and save an animated scatter plot in matplotlib:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

# Generate some data
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
sizes = np.random.randint(10, 100, N)

# Define the update function for the animation
def update(frame):
    ax.scatter(x[frame:], y[frame:], c=colors[frame:], s=sizes[frame:])
    ax.set_xlim(0, 1)
    ax.set_ylim(0, 1)
    ax.set_title('Frame {}'.format(frame))

# Create the figure and axis objects
fig, ax = plt.subplots()

# Create the animation object
anim = animation.FuncAnimation(fig, update, frames=N, interval=50)

# Save the animation as an mp4 movie
anim.save('scatter.mp4', writer='ffmpeg')

In this example, we create a FuncAnimation object that calls the update() function to update the scatter plot on each frame. We then save the animation as an mp4 movie using the save() method of the FuncAnimation object, passing the filename as the first argument and the writer as a keyword argument.

Note that in this example, we are using the FuncAnimation class instead of the Animation class, as the former is a subclass of the latter that simplifies the creation of animations by automatically handling the creation of frames and the updating of the plot.

this answer was automatically generated by ChatGPT.

Answered By: Dark Dragon