Shantanu Shinde
Shantanu Shinde

Reputation: 1012

Matplotlib animation not showing any plot

I am trying to make an animation in 3D using Matplotlib and mpl_toolkits. For starter, I am trying to make an animation of a shifting cos wave. But when I run the program, the plot is completely empty. I have just started learning matplotlib animations, so I don't have in-depth knowledge of it. Here is my code:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
import matplotlib.animation as animation

fig = plt.figure()
ax = Axes3D(fig)
line, = ax.plot([],[])
print(line)
X = np.linspace(0, 6*math.pi, 100)

def animate(frame):
    line.set_data(X-frame, np.cos(X-frame))
    return line

anim = animation.FuncAnimation(fig, animate, frames = 100,  interval = 50)

plt.show() 

Here is the output: enter image description here What is wrong with my code? Why am I not getting any output?

Upvotes: 0

Views: 415

Answers (1)

Martijn Eenink
Martijn Eenink

Reputation: 26

There are two issues with your code:

  • use set_data_3d to update the data of a Line3D object instead of set_data
  • initialize the Axes3D scales before starting the animation

This should work:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
import matplotlib.animation as animation

fig = plt.figure()

ax = Axes3D(fig)

# initialize scales
ax.set_xlim3d(0, 6 * math.pi)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(0, 100)

X = np.linspace(0, 6 * math.pi, 100)
line, = ax.plot([], [], [])

def animate(frame):
    # update Line3D data
    line.set_data_3d(X, np.cos(X - frame), frame)
    return line,

anim = animation.FuncAnimation(fig, animate, frames = 20,  interval = 50)
plt.show()

and yield an animation like this (I have truncated the number of frames to reduce image file size).

Upvotes: 1

Related Questions