制作简单的动态图表,用Matplotlib就可以了,Matplotlib中的FuncAnimation类可以通过一个迭代器不断创建图像帧,最后可以通过plt.show,或者直接save,将帧拼成动画保存下来。原理非常简单,博主简单做下记录,没有太多介绍。

前排放个参考链接,里面有更多炫酷的动图制作代码:Animatin-With-Matplotlib

放两个demo吧,一个是动态波浪:

from matplotlib import pyplot as plt 
import numpy as np 
from matplotlib.animation import FuncAnimation  
   
# initializing a figure in  
# which the graph will be plotted 
fig = plt.figure()  
   
# marking the x-axis and y-axis 
axis = plt.axes(xlim =(0, 4),  
                ylim =(-2, 2))  
  
# initializing a line variable 
line, = axis.plot([], [], lw = 3)  
   
# data which the line will  
# contain (x, y) 
def init():  
    line.set_data([], []) 
    return line, 
   
def animate(i): 
    x = np.linspace(0, 4, 1000) 
   
    # plots a sine graph 
    y = np.sin(2 * np.pi * (x - 0.01 * i)) 
    line.set_data(x, y) 
      
    return line, 
   
anim = FuncAnimation(fig, animate, init_func = init, 
                     frames = 200, interval = 20, blit = True) 
  
anim.save('continuousSineWave.gif', writer = 'PillowWriter', fps = 30)
anim.save('continuousSineWave.mp4', writer = 'ffmpeg', fps = 30)

其中最重要的是FuncAnimation类:

fig,要绘图的窗口

animate,动图绘制的回调函数,每次更新图片都在这个函数里面

frames,   帧数,也可以传入一个可迭代的对象,指定回调函数入参范围

interval,动画间隔时间,单位是ms

blit,是否进行某种动画渲染

如果要保存视频,你需要额外安装ffmpeg,否则你只能保存gif了,保存下来的gif一般比较大,保存下来的视频是这样子的

 

另外,再放另一个demo,原理也是一样的,只是传入的是一个迭代器

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


def update_points(num):
    point_ani.set_data(x[num], y[num])
    return point_ani,


def update_points_with_text(num):
    point_ani.set_data(x[num], y[num])
    if num % 5 == 0:
        point_ani.set_marker("*")
        point_ani.set_markersize(12)
    else:
        point_ani.set_marker("o")
        point_ani.set_markersize(8)

    text_pt.set_position((x[num],y[num]))
    text_pt.set_text("x=%.3f, y=%.3f"%(x[num],y[num]))
    return point_ani,text_pt,


x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

fig = plt.figure(tight_layout=True)
plt.plot(x, y)
point_ani, = plt.plot(x[0], y[0], "ro")
plt.grid(ls="--")
text_pt = plt.text(4, 0.8, '', fontsize=16)
ani = animation.FuncAnimation(
    fig, update_points_with_text, np.arange(0, 100), interval=100, blit=True)
ani.save('celluloid_legends.gif', writer = 'imagemagick')
plt.show()

另外,如果figure plt 画不了,那么你可以把图用camera.shot一张一张存下来,然后拼成gif动图,这个可以看文章开头的链接,里面那个3D视角切换的例子就是。

OK,See You Next Chapter!

发表评论

邮箱地址不会被公开。 必填项已用*标注