English: ```python
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
video_length = 10 # in seconds
video_fps = 30
num_frames = video_fps * video_length
angle_per_frame = (360 / num_frames)
stride = 5
width = 3
a = np.linspace(-width, width, 500)
b = a
x, y = np.meshgrid(a, b)
z = np.clip(-0.1 * (x**4 + y**4) - y**3 + x * y
, -5, 5)
plt.tick_params(left = False)
fig = plt.figure(figsize= (10,10))
ax = plt.axes(projection ='3d')
frame = ax.plot_wireframe(x, y, z, color ='#4a5a90', rstride=stride, cstride=stride)
def init():
ax.set_box_aspect((1,1,1))
ax.view_init(0, -90)
ax.axis('off')
ax.set_xlim(-1,1)
ax.set_ylim(-1,1)
ax.set_zlim(-1, 1)
return frame,
- animation function. This is called sequentially
def animate(i):
ax.view_init(0, -90 + angle_per_frame * i)
return frame,
- call the animator. blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=num_frames, blit=True)
anim.save('cusp.mp4', fps=video_fps, extra_args=['-vcodec', 'libx264'])
plt.show()
```