matplotlib实现动画

2023-05-16

原始动画绘制
1.在绘制图形,图像过程中,可以借助绘制时间的控制,逐步显示绘制内容,进而达到图形,
图像动态显示的效果
用plot()和scatter()绘制正弦波和散点图,其中散点图是动态沿着正弦波绘制.实现代码如下(我的测试环境是IDIE,如果是Jupyter Notebook环境下,效果不是很明显)

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0,2*np.pi,300)    #正弦x轴上一个周期360度的弧度值
y = np.sin(3*x)+5   #一个周期内振荡频率为3,在y轴上向上移动5
plt.plot(x,y,color='r')   #绘制正弦波图形
x1 = x[::2]
y1 = y[::2]
i = 0
for pos in x1:  #弹出一个x轴值,然后获取对应的y轴值,绘制散点图
    ax.scatter(pos,y1[i],c='b',marker='.')   #按照正弦波方向绘制散点图
    i += 1
    plt.pause(0.008)    #循环一次暂停0.008秒一下
plt.show()

如果是在Jupyter Notebook环境下需要在开头加入以下两行代码:

%matplotlib notebook
from IPython import display

在这里插入图片描述
2.draw()方法
plt.draw()可以根据提供的新数据,重新在数据区域绘制相应的新图形。
要改变,需要通过类似plt.plot(),plt.scatter()绘制工具返回的实例 ax 所附带的ax.set_xdata(x),ax.set_ydata(y)改变原先图形的x,y坐标范围,以达到改变图形的目的.至于动画效果,则是通过时间间隔的控制,让plt.draw有规律地反复重新绘制图帧,实现帧的动态替换。
1)简单重画设置
这里采用plt.draw()函数,根据plt.plot()绘图工具x,y坐标的变化,而重新动态绘制。代码如下

import numpy as np
import math
import matplotlib.pyplot as plt
from time import sleep  
plt.subplots()
xMax = 500
x = np.linspace(0,2*np.pi,xMax)
y = np.sin(x)
plt.plot(x,y,'b--')    #设置轨迹虚线
sleep(0.5)
ax,= plt.plot(x,y,'ro')   
i = 0
while i <= xMax:
    plt.pause(0.002)    #暂停0.002秒,功能同sleep()
    y1 = np.sin(x[:i])   #这里采用逐步增加y轴值范围的方法
    ax.set_xdata(x[:i])   #这里采用逐步增加x轴值范围的方法
    ax.set_ydata(y1)
    plt.draw()     #重画已经修改的图形
    i += 2      #获取范围控制,兼循环控制
plt.show()

在这里插入图片描述
2. 带按钮控制动画
下列代码采用 draw()方法重新绘制给予值的图形,实质上也是通过 sleep()来控制绘制进度,实现动态绘制的效果.

import numpy as np
from threading import Thread          
import math
import matplotlib.pyplot as plt
from time import sleep  
from matplotlib.widgets import Button     #导入按钮对象
fig,ax = plt.subplots()
#实验数据
x = np.arange(0,1,0.001)
y = np.sin(4*np.pi*x)*np.exp(-x) 
ax, = plt.plot(x,y,lw=1,marker='D',color='c')
class ButtonHandler:              #自定义按钮事件类,封装了单击事件的开始方法和停止方法
    def __init__(self):
        self.flag = True        #是否启动线程,动态处理绘制过程
        self.x_s,self.x_e,self.x_step = 0,1,0.01
    def threadStart(self):       #线程开始函数,用来更新数据并重新绘制图形
        while self.flag:
            sleep(0.02)
            self.x_s += self.x_step     #开始位置一次加0.01
            self.x_e += self.x_step    #结束位置一次加0.01
            x1 = np.arange(self.x_s,self.x_e,self.x_step)   
            y1 = np.sin(4*np.pi*x1)*np.exp(-x1)     #输出y轴范围值
            ax.set_xdata(x1-x1[0])      #重新绘制新绘制区域x,y数据
            ax.set_ydata(y1)
            plt.draw()                 #重新绘制图形
    def Start(self,event):
        self.flag = True
        t1 = Thread(target=self.threadStart)        #创建并启动线程
        t1.start()
    def Stop(self,event):
        self.flag = False
callback = ButtonHandler()
#利用两个新的axes区域,创建按钮并设置单击事件处理函数
y1 = 0.8
ax1 = plt.axes([0.81,0.05+y1,0.1,0.075])
bs = Button(ax1,'Stop',color='m')
bs.on_clicked(callback.Stop)
ax2 = plt.axes([0.7,0.05+y1,0.1,0.075])
bp = Button(ax2,'Start',color='y')
bp.on_clicked(callback.Start)
plt.show()

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matplotlib实现动画 的相关文章

  • PowerBuilder制作纸牌游戏

    本文记录的是2001年我大三那年假期制作小游戏的思路 xff0c 希望给在读计算机专业的朋友们一些参考 xff0c 如果还没来得及动手尝试的同学 xff0c 一定要勇于动手 你们一定比我做得更好 制作动力 xff1a 我有一个好朋友 xff
  • 【Qt线程-1】this,volatile,exec(),moveToThread()

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 2 事件循环 xff08 QCoreApplication processEvents xff0c exec xff09 的应用 Qt线程 3 使
  • 【Qt线程-2】事件循环(QCoreApplication::processEvents,exec)的应用

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 3 使用事件循环 xff0c 信号 xff0
  • 【Qt线程-4】事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 2 事件循环 xff08 QCo
  • 【Qt样式(qss)-3】几套配色方案

    背景 xff1a 之前写过有关qss的博客 xff0c 记录了如何使用qt手册 xff0c 以及在项目中如何使用qss的体验 经过实践 xff0c 我归纳了自己需要的qss使用方法 xff0c 使之尽量高效 xff0c 容易维护 Qt样式
  • 【Qt样式(qss)-4】应用到QMdiArea不生效的解决

    背景 xff1a 之前写记录过几篇qss相关内容 xff1a Qt样式 xff08 qss xff09 1 手册小结 xff08 附例 xff1a 软件深色模式 xff09 Qt样式 xff08 qss xff09 2 使用小结 xff08
  • Google play billing(Google play 内支付) 下篇

    开篇 xff1a 如billing开发文档所说 xff0c 要在你的应用中实现In app Billing只需要完成以下几步就可以了 第一 把你上篇下载的AIDL文件添加到你的工程里 xff0c 第二 把 lt uses permissio
  • Qt creator中操作QAction加入QToolBar

    背景 xff1a 个人笔记 我之前没有系统化学习过任何资料 xff0c 使用很多工具都是按需出发 xff0c 直接上手 xff0c 遇到问题再研究的 所以会有一些弯路 本文言语中难免有对个人情绪的生动描述 xff0c 希望不要影响读者心情
  • Java 通过map构造树形结构

    在开发中 xff0c 经常会有将 数据组装成为树形结构的场景 xff0c 除了可以通过递归实现 xff0c 还可以通过map 组装实现 一 xff0c 构造基本数据 import apple laf JRSUIUtils import co
  • 【无标题】es搜索基本操作

    一 xff0c 准备数据 1 创建索引 PUT lagou book 2 创建mapping PUT lagou book doc mapping 34 properties 34 34 description 34 34 type 34
  • 【ES】常用操作工具

    工欲善其事 xff0c 必先利于器 xff0c es使用过程中 xff0c 有些工具能帮助我们快速的上手和使用 一 es head es head 是一款专门针对 es的客户端工具elasticSearch配置包 是一个基于node js的
  • 【es】基本概念理解

    一 xff0c 初识es 1 是什么 xff1f ElasticSearch 简称es 开源的分布式的全文搜索引擎 xff0c 可以近乎实时的存储检索数据 xff0c es使用java开发 xff0c 并且使用Lucene作为核心实现搜索功
  • 无法安装net framework 3.5 的解决方法

    电脑刚重装了Windows8 1系统 xff0c 然后安装数据库的时候 xff0c 却出现了这样的问题 xff1a 您的电脑上的应用需要使用以下windows功能 问题原因是 xff1a 在安装系统的时候 xff0c NET Framewo
  • 【计算机网络原理】第四章 数据链路层

    今天主要梳理了一下数据链路层的内容 xff0c 如下 一 宏观规划 综合数据链路层的整体 xff0c 分为两大部分 xff0c 第一部分讲解数据链路层的功能 xff0c 第二部分讲解数据链路层的功能 这些协议 xff0c 其实还是为了实现数
  • 【redis】关系型数据库 VS 非关系型数据库

    一 关系型数据库 xff1f 1 概念 关系型数据库是指采用了关系模型来组织数据的数据库 简单来说 xff0c 关系模式就是二维表格模型 主要代表 xff1a SQL Server xff0c Oracle Mysql PostgreSQL
  • resultful风格接口

    一 产生背景 网络应用程序 xff0c 越来越流行前端和后端的分离设计 当前的发展趋势是前端的设计层出不穷 比如 xff1a 各种型号的手机 平板灯其他设计 因为必须要一种统一的机制方便不同的前端和后端进行通信 这就导致了API结构的流行
  • 【kafka】Exception thrown when sending a message with key='null' and payload='lizhenjuan;99' to topic

    今天碰到一个奇怪的问题 xff0c 如下图 xff1a 一 问题 1 问题截图 上午还可以发送消息成功的 xff0c 下午突然就发送不了消息了 我就检查我代码的问题 xff0c 是传递的格式不对 xff0c 还是数据要求不对 网上的资料显示
  • 【0723】自动化运维——saltstack

    24 1 自动化运维介绍 认识自动化运维 xff1a 传统运维效率低 xff0c 大多工作人为完成传统运维工作繁琐 xff0c 容易出错传统运维每日重复做相同的事情传统运维没有标准化流程传统运维的脚本繁多 xff0c 不能方便管理自动化运维
  • 【mysql】order by多个字段排序

    今天遇到了两个字段排序的问题 xff0c 感觉不是很清晰 xff0c 所有又按照规则查询了下 xff0c 总结下 count都是306的有三个 现在需要同时按照age和count排序 xff0c 测试最后的排序结果 默认都是按照age和co
  • java8使用积累

    1 将List lt T gt 数组转换为String并用逗号隔开 String join 34 34 List 2 idea自动补全代码教程 xff1a https www cnblogs com HF Made p 11417225 h

随机推荐