1.6绘制动态图

从理解原理入手,使用matplotlib绘制你想要的任何图形!
欢迎浏览我的专栏:https://blog.csdn.net/qq_40761869/article/category/9403564

# 现在我们可以根据给定的函数绘制图像,也可以根据给定的参数方程绘制图形,也可以绘制直角坐标系与极坐标系下的图像,还可以多窗口多子图绘制
# 那么如果我们想绘制一副动图,该怎么办呢
# 官方推荐使用matplotlib的animation模块
from matplotlib import pyplot
from matplotlib import animation
from numpy import *

# 绘制动图的核心就是animation模块中定义的FuncAnimation()类,它在初始化时有几个参数:
# __init__(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)
# fig是窗口对象,注意这个需要编程手动指定,因为没有封装
# func是在每一帧都会调用的函数,它的参数列表的第一个参数在每次调用时都由frames提供。更多的参数可以用fargs提供
# frames是可迭代的列表,也可以是python生成器,其他类型的参数可以参考源文件中的说明。frames中的值在每一轮(也即每一帧)都会向func函数中传递下一个值作为func的参数
# init_func是初始化函数,如果没有指定,那么默认绘制frames容器中第一个值所对应的图像
# fargs是每一次调用func函数时传递给它的额外参数
# interval是帧与帧之间的时间间隔,按毫秒计算

# 经过上面的了解,我们可以认识到,最重要的就是这两个参数:func和frames
# func是更新函数,所以我们也只能在func里进行操作
# frames是向func传递参数的。
# 如果我们用不到已经显示过的数据,那么自然也不希望保存它们,否则这个列表将会随着时间流逝而慢慢变大,最终影响内存空间。
# 所以那种情况下,最好可以写成一个python生成器

# 接下来绘制一副动图,两个点分别沿x和y轴振动,另外绘制一个点,它的坐标投影对应x和y上这两个点
# 先获得figure对象和axis对象
fig, ax = pyplot.subplots()
# 然后获得线条句柄
# 这里需要说明一下,绘制动图的基本结构为:
# 获取figure和axis对象
# 在axis对象上创建图形对象(如果是2D,也就是这里的line1和line2,那它们就是matplotlib.lines.Line2D类的对象)
# 定义func函数,函数内修改图形对象(调用图形对象的方法)
# 定义frames生成器,为func生成参数
# 定义init函数,确定初始显示范围
# 初始化FuncAnimation类
# pyplot.show()
# 所以我们修改的其实是图形对象,而非axis,也非figure,这样可以有效避免空间浪费、节省时间
# 不要尝试使用其他结构,否则会出各种各样奇怪的bug
line1, = pyplot.plot([], [], 'ro')
line2, = pyplot.plot([], [], 'b-')
ax.grid(b=True, axis='both')

def update(frame):
    line1.set_data([sin(frame), sin(frame), 0], [0, cos(frame), cos(frame)])
    line2.set_data([sin(frame), sin(frame), 0], [0, cos(frame), cos(frame)])

def init():
    ax.set_xlim(-1.5, 1.5)
    ax.set_ylim(-1.5, 1.5)

# 这里的生成器可以定义为无穷序列,而且内存空间也不会浪费
def gen_frames():
    time = 0
    while True:
        yield time
        time += 0.01

# 一定一定要注意,这里必须使用一个容器来引用FuncAnimation类实例化的对象(在这里ani是FuncAnimation类的对象),否则垃圾回收机制将把FuncAnimation类的实例化对象回收,也就没有办法显示动态图像了
ani = animation.FuncAnimation(fig, func=update, frames=gen_frames, init_func=init, interval=10)
pyplot.show()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值