使用matplotlib制作动态图

这篇具有很好参考价值的文章主要介绍了使用matplotlib制作动态图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

matplotlib(https://matplotlib.org/)是一个著名的python绘图库,由于其灵活强大的绘图功能使得在python中可视化变得非常容易,关于matplotlib的基础知识这里不再介绍,有疑问可以去官网翻Tutorials和example学习。由于我们实际使用时常常是绘制静态图,忽略了matplotlib的动态图生成功能,同时matplotlib生成动态图的功能不是非常友善,因此大部分人在真的需要制作动态图时都会选择先用matplotlib生成一系列静态图片,然后再用其它相对比较容易使用的第三方python库生成动态图,如imageio(https://imageio.readthedocs.io/en/stable/#), 或者使用其它工具,如Matlab。这里打算简单介绍一下在matplotlib库中制作动态图的方法。

二、模块简介

matplotlib的animation模块提供了动态图制作功能,animation类提供了两个方法来生成动态图,即FuncAnimationArtistAnimation,这里我们使用FuncAnimation方法重复调用函数来生成图片。

1. FuncAnimation类介绍

FuncAnimation类的主要参数包括:

  • fig: 每一帧画面绘制使得Figure对象
  • func: 定义动画每一帧的更新函数,通常这一函数需要包含额外参数,此时可以用functools.partial来生成。
  • frames:可以是可迭代对象,整数,或者生成函数或者缺省。
  • init_func:初始化函数
  • inteval:每一帧画面的停留时间
  • repeat:当动态图中所有帧都播放完了之后是否重复播放
  • bilt:是否使用blitting来优化绘图

2. 定义动画更新函数

FunAnimation类中,更新函数在每一帧中都会被重新调用,通过在更新函数中更改一些绘图函数的数据,在每一帧我们就能得到不同的图片,然后FunAnimation的Writer(后端)将这些图片组合就能得到动态图片。关于更新函数的一些需要注意的地方是:

  • 如果设置了bilt == True,更新函数的最后就需要返回所有被修改或创建的Artists的引用变量
  • 生成函数的第一个传入参数必须是当前的帧数,其具体值可以通过frames参数定义,可以是可迭代类型或整数

三、使用matplotlib制作动画

1.一步法制作动态图片

由于matplotlib本身自带强大的绘图功能,因此我们可以不用生成图片,直接在初始绘图的基础上通过更新函数来修改绘图数据,一步直接生成动态图片,方便快捷,以下是代码:

import numpy as np
from matplotlib.animation import FuncAnimation
import matplotlib.pyplot as plt
from functools import partial

### 绘制y=sin(2pi(x+t/t_0))*sin(2pi(t/t_0))
def getSinx_t(t=0, t_0=120, x_count=1e5):
    x = np.linspace(0.0, 1.0, int(x_count))
    y = np.sin(2.0*np.pi*(x + t/t_0))*np.sin(t/t_0*2.0*np.pi)
    return x, y


### 图片初始化
fig, ax = plt.subplots(dpi=100)
ax.set_aspect('auto')
ax.set_xlim((0.0, 1.0))
ax.set_ylim((-1.0, 1.0))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title(r'$y=sin[2\pi(x+t/t_0)]*sin(2\pi t/t_0)$')


### 绘制初始曲线
x, y = getSinx_t()
y_up = y[np.where(y>0)]
x_up = x[np.where(y>0)]
x_dn = x[np.where(y<0)]
y_dn = y[np.where(y<0)]
plot_line = ax.plot(x, y)
plot_hline = ax.hlines(y=0.0, xmin=0.0, xmax=1.0, linestyles='dashed', colors='grey')
fill_xy_up = ax.fill_between(x=x_up, y1=y_up, y2=0, color='red', alpha=0.3)
fill_xy_dn = ax.fill_between(x=x_dn, y1=y_dn, y2=0, color='green', alpha=0.3)
plot_text = ax.text(x=0.8, y=0.75, s='t=0', fontsize=16, fontfamily='cursive')


### 定义动画更新函数
def UpdateFigure(num, f_plot_line, f_fill_xy_up, f_fill_xy_dn, f_plot_text):
    x_update, y_update = getSinx_t(t=num)
    f_plot_line[0].set_data(x_update, y_update)
    f_plot_text.set_text('t={}'.format(num))
    x_up = x_update[np.where(y_update>0)]
    y_up = y_update[np.where(y_update>0)]
    xy_up1 = np.column_stack((x_up, y_up))
    xy_up2 = np.column_stack((x_up[::-1], np.zeros(x_up.shape)))
    x_dn = x_update[np.where(y_update<0)]
    y_dn = y_update[np.where(y_update<0)]
    xy_dn1 = np.column_stack((x_dn, y_dn))
    xy_dn2 = np.column_stack((x_dn[::-1], np.zeros(x_dn.shape)))
    f_fill_xy_up.set_verts([np.vstack((xy_up1, xy_up2))])
    f_fill_xy_dn.set_verts([np.vstack((xy_dn1, xy_dn2))])
    return [f_plot_line[0], f_fill_xy_up, f_fill_xy_dn, f_plot_text]


### 创建FunAnimation对象
ani = FuncAnimation(fig, partial(
        UpdateFigure, 
        f_plot_line=plot_line, 
        f_fill_xy_up=fill_xy_up,
        f_fill_xy_dn=fill_xy_dn,
        f_plot_text=plot_text),
    np.arange(120),
    blit=True)


### 保存动态图片
ani.save('sinxt.gif', fps=60)  

以下为得到的动态图片:
使用matplotlib制作动态图

2. 两步法制作动态图片

所谓两步法是指,首先用matplotlib生成一系列静态图片,然后结合matplotlib.image.imread读取图片功能和matplotlib.axes.Axes.imshow展示图片功能,来动态地更新图片,这种方法相比于上一种方法稍微复杂,但是这种方法灵活性更高,同时也可以用来组合一些非matplotlib生成的图片。以下为代码:

import matplotlib.pyplot as plt
import matplotlib.image as mimg
from matplotlib.animation import FuncAnimation
import numpy as np
from functools import partial
import os


### 绘制y=cos(2pi(x+t/t_0))*cos(2pi(t/t_0))
def getCosx_t(t=0, t_0=120, x_count=1e5):
    x = np.linspace(0.0, 1.0, int(x_count))
    y = np.cos(2.0*np.pi*(x + t/t_0))*np.cos(t/t_0*2.0*np.pi)
    return x, y


fig_count = 120             # 图片总数


### 定义生成所有图片的函数
def getFigrues(fig_count):
    try:
        os.mkdir('fig')
    except FileExistsError:
        print("Dir Exist!")
    for i in range(fig_count):
        fig, ax = plt.subplots(dpi=100)
        ax.set_aspect('auto')
        ax.set_xlim((0.0, 1.0))
        ax.set_ylim((-1.0, 1.0))
        ax.set_xlabel('x')
        ax.set_ylabel('y')
        ax.set_title(r'$y=cos[2\pi(x+t/t_0)]*cos(2\pi t/t_0)$')
        x, y = getCosx_t(t=i)
        y_up = y[np.where(y>0)]
        x_up = x[np.where(y>0)]
        x_dn = x[np.where(y<0)]
        y_dn = y[np.where(y<0)]
        ax.plot(x, y)
        ax.hlines(y=0.0, xmin=0.0, xmax=1.0, linestyles='dashed', colors='grey')
        ax.fill_between(x=x_up, y1=y_up, y2=0, color='red', alpha=0.3)
        ax.fill_between(x=x_dn, y1=y_dn, y2=0, color='green', alpha=0.3)
        ax.text(x=0.8, y=0.75, s='t={}'.format(i), fontsize=16, fontfamily='cursive')
        fig.show(False)
        fig.savefig('./fig/{}.jpg'.format(i))
        plt.close(fig)
getFigrues(fig_count) 


### 读取图片尺寸
def GetFigSize(fig_path='./fig/0.jpg'):
    now_img = mimg.imread(fname=fig_path)
    img_pxy = now_img.shape
    return img_pxy[1], img_pxy[0]


### 绘图初始化
img_px, img_py = GetFigSize()
img_dpi=100
fig, ax = plt.subplots(figsize=[img_px/img_dpi, img_py/img_dpi], dpi=img_dpi)
ax.set_aspect('equal')
ax.set_position([0.0, 0.0, 1.0, 1.0])
ax.set_axis_off()
plot_img = ax.imshow(X=np.zeros((img_py, img_px, 3)))


### 定义动画更新函数
def UpdateImages(num, f_plot_img):
    now_img_path = './fig/{}.jpg'.format(num)
    now_img = mimg.imread(fname=now_img_path)
    f_plot_img.set_data(now_img)
    return [f_plot_img]


### 创建FunAnimation对象
ani = FuncAnimation(
    fig, partial(UpdateImages, f_plot_img=plot_img),
    np.arange(fig_count),
    blit=True)


### 保存动态图片
ani.save('cosxt.gif', fps=60)  

得到的动态图片:
使用matplotlib制作动态图文章来源地址https://www.toymoban.com/news/detail-490471.html

到了这里,关于使用matplotlib制作动态图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 利用Matplotlib制作初中时圆规画的图

    大家在初中时,开始学习圆相关的知识,涉及圆的半径、周长、面积 等等,那会每位同学基本都会买一套圆规、三角板,来辅助学习和做作业使用,这些学习工具在闲暇时光也被用来玩耍,偶然间就拿着圆规在纸上画了这么一个图形,所有的圆心在同一个圆上,该图形一直记

    2024年02月11日
    浏览(34)
  • 【Unity使用addressables制作资源热更+实时动态热更基本记录】

    一、Addressables基础操作教程 1、下载Addressables插件 点击菜单Window / Package Manager,打开插件包管理界面,搜索addressables Addressables的打包方式其实也是AssetBundle格式,只是在此基础上做了一层封装,方便进行管理(比如打包、加载、依赖等)。而我们知道,没有加密的AssetBundle是

    2024年02月10日
    浏览(36)
  • matplotlib绘制动态瀑布图

    绘制瀑布图思路:遍历指定文件目录下所有的csv文件,每读一个文件,取文件前20行数据进行保存,如果超过规定的行数300行,将最旧的数据删除,仅保留300行数据进行展示。 网上找的大部分绘制瀑布图的代码,均无法呈现动态效果。不是动态的效果还能称为瀑布图吗?(疑问

    2024年01月18日
    浏览(46)
  • python的matplotlib绘制动态图形(用animation中的FuncAnimation)

    %matplotlib auto # 数据透视表: # 统计各月每天的刷卡金额之和 # month_day_df = pd.pivot_table(data_df,values=\\\"刷卡金额\\\",index=\\\"日\\\",columns=\\\"月份\\\",aggfunc=np.sum) # 用折线图表示1月份每天的刷卡金额之和 import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 导入动画库 import random import

    2023年04月18日
    浏览(47)
  • HTTPS简介

    http协议是明文传输的,因此很容易被截取和解析,泄漏个人数据。https协议是在http和tcp之间多添加了一层,进行身份验证和数据加密。 HTTPS 原理 ① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器   ② 服务器从算法列表中选择一种加密算法,并将它

    2024年02月15日
    浏览(23)
  • libcurl:https认证控制参数简介

    目录 1 背景 2 curl命令 3 libcurl 控制参数 4 双向认证 5 参考文档         在使用浏览器访问https链接时,浏览器会自动请求网站的安全证书,并进行证书校验,以及(使用证书)参与后续的通道加密逻辑。         而使用curl(不管是curl.exe命令行工具,还是使用libcurl库)

    2024年02月16日
    浏览(39)
  • 关于https的加密流程简介(图解)

    目录 对称加密: 非对称加密 在网络发展的初阶,为了保护数据安全,防止黑客攻击,我们发明了对称加密 即一把秘钥,客户端和服务器通过这把钥匙对数据进行加密/解密 理想情况下,只要没有人能获取我的秘钥,那么我的数据就是非常安全,没有人能够知道里面的内容

    2024年02月13日
    浏览(35)
  • 基于Python的疫情数据可视化(matplotlib,pyecharts动态地图,大屏可视化)

    有任何学习问题可以加我微信交流哦!bmt1014 1、项目需求分析 1.1背景 2020年,新冠肺炎疫情在全球范围内爆发,给人们的健康和生命带来了严重威胁,不同国家和地区的疫情形势也引起了广泛的关注。疫情数据的监测和分析对疫情防控和科学防治至关重要。本报告以疫情数据

    2024年02月05日
    浏览(56)
  • 从静态到动态化,Python数据可视化中的Matplotlib和Seaborn

    本文分享自华为云社区《Python数据可视化大揭秘:Matplotlib和Seaborn高效应用指南》,作者: 柠檬味拥抱。 首先,确保你已经安装了Matplotlib和Seaborn库。如果没有安装,可以使用以下命令进行安装: Matplotlib是一个灵活的绘图库,支持多种图表类型。以下是一个简单的折线图的

    2024年03月25日
    浏览(84)
  • HTTP/HTTPS 简介||HTTP 消息结构

    HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件、图片文件、查询结果等)。 HTTPS 协议是 HyperText Transfer Protocol Secure(超文本传

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包