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 = 8
width = 1
a = np.linspace(-width, width, 600)
b = a
x, y = np.meshgrid(a, b)
z = -20*x**5 + 4*x**3 - 2*y*x - 0.5 * (x**4 + y**4)
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 scale(i):
k = (i / num_frames * np.pi)
return (1-np.cos(k))/2 * num_frames
- k = (i / num_frames - 0.5) * 10
- return (np.tanh(k)+1)/2 * num_frames
def init():
ax.set_box_aspect((1,1,1))
ax.view_init(0, 0)
ax.axis('off')
ax.set_xlim(-0.2,0.2)
ax.set_ylim(-0.2,0.2)
ax.set_zlim(-0.1, 0.1)
return frame,
- animation function. This is called sequentially
def animate(i):
ax.view_init(0, 0 + angle_per_frame * scale(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('butterfly.mp4', fps=video_fps, extra_args=['-vcodec', 'libx264'])
plt.show()
```