matplotlib绘制李萨如图(二)
——动态2D李萨如图
1 前期回顾
众所周知,动图是由一帧一帧静态图构成的,要绘制出动态图,首先要掌握静态图的绘制。
2 主要函数
FuncAnimation
除了上面链接里要用到的绘图用基本函数,绘制动图主要使用的就是matplotlib中的animation库的FuncAnimation函数。
函数FuncAnimation(fig,func,frames,init_func,interval,blit)
是绘制动图的参数如下:
fig:要绘制动图的画布名称;
func:更新动画的函数,注意该函数只能有一个形参传入;
frames:一个数组,其大小为动画一次循环的帧数,而数组中的值在函数运行时会传递给之前传入的函数func;
init_func:自定义开始帧,即传入刚定义的函数init,初始化函数;
interval:更新频率,单位为ms;
blit:选择更新所有点,还是仅更新产生变化的点。应选择True,但mac用户请选择False,否则无法显示。
updata
这个函数就是传入上述FuncAnimation中func参数的,需要我们自己来写。
要注意,这个函数只能有一个参数传入,所以我们在制作动图的时候也只能定一个变化量。
在updata中,我们需要绘制下一帧的画面并更新:
def updata(n):
x=np.sin(p*theta)
y=np.sin(q*theta+n*np.pi)
Liss.set_data(x,y)
return Liss
注意,这里的Liss是Line2D
类型的变量,我们才能用set_data
去修改。
save
简单一点的用法就是直接ani.save('保存的文件名')
,就可以在代码所在文件夹保存动图,还有更多的用法可以参考这篇博客
3 完整代码及效果
上面也说了,updata函数只能作用于Line2D
类型的变量,而plot
函数返回的是一个长度为1的list
,所以我们需要先从list
里面把我们想要更改的Line2D
拿出来。
可以用
a=axs.plot(x,y)
Liss=a[0]
把这个list
里唯一的的元素提取出来,也可以用
Liss,=axs.plot(x,y)
直接提取,更多可见这篇博客。
import matplotlib.pyplot as plt
import numpy as np
import time
import matplotlib.animation as animation
fig=plt.figure()
axs=fig.add_subplot(111)#1*1的网格,第1个图
axs.set(xlim=[-1,1],ylim=[-1,1],title='Lissajous-Figure')
theta=np.linspace(0,2*np.pi,1000)
x=np.sin(theta)
y=np.sin(theta)
Liss,=axs.plot(x,y)
p=1
q=1
def updata(n):
x=np.sin(p*theta)
y=np.sin(q*theta+n*np.pi)
Liss.set_data(x,y)
return Liss
ani=animation.FuncAnimation(fig,updata,frames=np.linspace(0,2,100),interval=10)
ani.save('Liss.gif')
plt.show()
麻了,上传不了gif,大家把代码复制下来自己跑一边即可……