python画图|曲线动态输出

news2024/11/26 11:07:15

【1】引言

前序教程中的曲线动态输出,其实是把曲线按照左右移动的形式输出(波的传递形式)。

python画图|曲线动态输出基础教程_python 动态曲线-CSDN博客

但有些时候我们更期待的是曲线不移动,随着自变量的增加而输出因变量,因此这是两种曲线输出教程。

基于上述区别说明,很有必要对后一种方法进行探索。

【2】官网教程

首先点击下述链接可以直达官网,我们将会看到期待的动态输出曲线。

https://matplotlib.org/stable/gallery/animation/animate_decay.html#sphx-glr-gallery-animation-animate-decay-py

基于此我们对官网教程进行解读。

【3】代码解读

首先引入了好几个模块:

import itertools #引入itertools模块,可实现变量无限输出

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

import matplotlib.animation as animation #引入动画模块

这里的itertools模块第一次引入,可以实现比自变量的无限输出。

然后先定义了一个变量产生函数,并将自变量和因变量的关系进行了定义:

def data_gen(): #自定义函数,使用itertools.count()模块
    for cnt in itertools.count(): #创造一个从0开始,步长是1的无线循环,输出结果全部赋值给cnt
        t = cnt / 10  # 计算cnt/10后赋值给t
        yield t, np.sin(2*np.pi*t) * np.exp(-t/10.) #返回t, np.sin(2*np.pi*t) * np.exp(-t/10.)

之后再定义了变量的范围:

def init(): #自定义函数
    ax.set_ylim(-1.1, 1.1) #设置Y轴范围
    ax.set_xlim(0, 1) #设置X轴范围
    del xdata[:] #定义一个空矩阵xdata[]
    del ydata[:] #定义一个空矩阵ydata[]
    line.set_data(xdata, ydata) #设置曲线的自变量和因变量
    return line, #返回曲线的数值

其实直到此时,才完成要画图对应各个变量的定义,并且自变量和因变量还是空矩阵。

完成变量的初步定义之后,定义要画图:

fig, ax = plt.subplots() #定义要画图
line, = ax.plot([], [], lw=2) #定义要画曲线
ax.grid() #给输出曲线增加网格
xdata, ydata = [], [] #定义xdata和ydata为空矩阵

在前述的定义中,自变量一直未实质赋值,接下来通过append()函数进行赋值,并修改了X轴的范围:

def run(data): #自定义函数
    # update the data
    t, y = data #定义变相t和y
    xdata.append(t) #xdata为t的所有取值
    ydata.append(y) #ydata为y的所有取值
    xmin, xmax = ax.get_xlim() #X轴的最小值和最大值(xmin和xmax)从xlim()中取出

    if t >= xmax: #当自变量超出X轴上限
        ax.set_xlim(xmin, 2*xmax) #将X轴取值扩大两倍
        ax.figure.canvas.draw() #输出图形
    line.set_data(xdata, ydata) #定义曲线变量

    return line, #返回曲线值

最后实现动态输出:

ani = animation.FuncAnimation(fig, run, data_gen, interval=100, init_func=init,
                              save_count=100) #输出动画
plt.show() #输出图形

此时获得的输出结果为:

5f7b30fa721849abb0956694981b6eb1.gif

图1

此时对应的完整代码为:

import itertools #引入itertools模块,可实现变量无限输出

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

import matplotlib.animation as animation #引入动画模块


def data_gen(): #自定义函数,使用itertools.count()模块
    for cnt in itertools.count(0.,0.5): #创造一个从0开始,步长是1的无线循环,输出结果全部赋值给cnt
        t = cnt / 10  # 计算cnt/10后赋值给t
        yield t, np.sin(2*np.pi*t) * np.exp(-t/10.) #返回t, np.sin(2*np.pi*t) * np.exp(-t/10.)


def init(): #自定义函数
    ax.set_ylim(-1.1, 1.1) #设置Y轴范围
    ax.set_xlim(0, 1) #设置X轴范围
    del xdata[:] #定义一个空矩阵xdata[]
    del ydata[:] #定义一个空矩阵ydata[]
    line.set_data(xdata, ydata) #设置曲线的自变量和因变量
    return line, #返回曲线的数值

fig, ax = plt.subplots() #定义要画图
line, = ax.plot([], [], lw=2) #定义要画曲线
ax.grid() #给输出曲线增加网格
xdata, ydata = [], [] #定义xdata和ydata为空矩阵


def run(data): #自定义函数
    # update the data
    t, y = data #定义变相t和y
    xdata.append(t) #xdata为t的所有取值
    ydata.append(y) #ydata为y的所有取值
    xmin, xmax = ax.get_xlim() #X轴的最小值和最大值(xmin和xmax)从xlim()中取出

    if t >= xmax: #当自变量超出X轴上限
        ax.set_xlim(xmin, 2*xmax) #将X轴取值扩大两倍
        ax.figure.canvas.draw() #输出图形
    line.set_data(xdata, ydata) #定义曲线变量

    return line, #返回曲线值

# Only save last 100 frames, but run forever
ani = animation.FuncAnimation(fig, run, data_gen, interval=100, init_func=init,
                              save_count=100) #输出动画
plt.show() #输出图形
#ani.save('ani.gif') #保存动画

实际上,当在PC上运行上述代码时,输出的图形是无限的,不会停止。

bb12fb654cdb44539af6c65e3a35a07b.png

图2

这是因为itertools.count()函数并没有给出任何停止输出自变量的信号,因此有必要设置输出停止代码。

【3】代码改写

在itertools.count()函数下方增加break操作:

if(t>20):
    break

此时的完整代码为:

import itertools #引入itertools模块

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

import matplotlib.animation as animation #引入动画模块


def data_gen(): #自定义函数,使用itertools.count()模块
    for cnt in itertools.count(0.,0.5): #创造一个从0开始,步长是1的无线循环,输出结果全部赋值给cnt
        t = cnt / 10  # 计算cnt/10后赋值给t
        yield t, np.sin(2*np.pi*t) * np.exp(-t/10.) #返回t, np.sin(2*np.pi*t) * np.exp(-t/10.)
        if(t>20):
            break


def init(): #自定义函数
    ax.set_ylim(-1.1, 1.1) #设置Y轴范围
    ax.set_xlim(0, 1) #设置X轴范围
    del xdata[:] #定义一个空矩阵xdata[]
    del ydata[:] #定义一个空矩阵ydata[]
    line.set_data(xdata, ydata) #设置曲线的自变量和因变量
    return line, #返回曲线的数值

fig, ax = plt.subplots() #定义要画图
line, = ax.plot([], [], lw=2) #定义要画曲线
ax.grid() #给输出曲线增加网格
xdata, ydata = [], [] #定义xdata和ydata为空矩阵


def run(data): #自定义函数
    # update the data
    t, y = data #定义变相t和y
    xdata.append(t) #xdata为t的所有取值
    ydata.append(y) #ydata为y的所有取值
    xmin, xmax = ax.get_xlim() #X轴的最小值和最大值(xmin和xmax)从xlim()中取出

    if t >= xmax: #当自变量超出X轴上限
        ax.set_xlim(xmin, 2*xmax) #将X轴取值扩大两倍
        ax.figure.canvas.draw() #输出图形
    line.set_data(xdata, ydata) #定义曲线变量

    return line, #返回曲线值

# Only save last 100 frames, but run forever
ani = animation.FuncAnimation(fig, run, data_gen, interval=0.10, init_func=init,
                              save_count=1000) #输出动画
ani.save('ani-1000.gif') #保存动画
plt.show() #输出图形

运行代码后将发现,自变量最大值为20:

f89d06124ff0449db8c172463ccf17e4.gif

图3

【4】总结

探索了曲线动态输出的教程,掌握了输出范围等的设置技巧。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信号与系统学习:傅里叶级数

一、基本概念 1. 什么是傅里叶级数? 傅里叶级数是一种数学工具,可以将一个周期函数分解为一系列正弦和余弦函数(即三角函数)的和。这些正弦和余弦函数的频率是原函数的整数倍。 2. 为什么要使用傅里叶级数? 信号分…

【STM32+HAL】OV2640捕获图像显示

一、准备工作 有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片: STM32F407ZGT6 2、IDE: MDK-Keil软件 3、库文件:STM32F4xxHAL库 三、实现功能 通过OV2640捕获图像…

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程,并创建美观、一致的用户界面?您的搜索到此为止!我们的Flutter UI组件库(JUI)提供了广泛的预构建、可自定义组件,帮助您快速构建…

为什么会配置足够打LOL等网游很卡?12代大小核处理器最典型

卡顿原因及优化建议 大小核调度问题: 调度不当:某些游戏未针对大小核进行优化,可能导致系统将负载分配到效率核(小核),而性能核(大核)未被充分利用。操作系统调度策略:尽…

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录,还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录,还可以更新…

文件操作(1) —— 文件基础知识

目录 1. 为什么使用文件? 2. 文件种类【按功能分】 3. 文件名 4. 数据文件种类【按存储方式细分】 5. 文件的打开和关闭 5.1 流和标准流 5.2 文件指针 5.3 文件的打开和关闭函数 6. 文件缓冲区 1. 为什么使用文件? 如果没有⽂件,我…

Vue笔记-浏览器窗口改变时,重新计算表格高度并设置

当窗口大小改变时,你监听 window 对象的 resize 事件,然后在事件处理程序中重新计算表格的高度。在 Vue 中,可以在组件中通过 created 生命周期钩子来添加事件监听器,然后在组件销毁时移除事件监听器。 如下vue代码: …

Android GPU Inspector分析帧数据快速入门

使用 谷歌官方工具Android GPU Inspector (AGI) 可以对Android 应用进行深入和全面的系统性能分析和帧性能分析 。AGI 是一个非常强大的分析工具,尤其是在需要诊断 GPU 性能问题和优化应用时,可以帮助你精准找到性能瓶颈。本文介绍如何使用该工具对帧数据…

24V转3.3V2A同步降压WT6030

24V转3.3V2A同步降压WT6030 WT6030 是一种高效同步整流降压开关模式转换器,集成内部功率 MOSFET,能在宽输入电源范围内提供较高的输出电流,以下是使用 WT6030 将 24V 降压到 3.3V 输出 2A 电流的相关设计要点: 1. 电路设计 输入电…

零基础Java第九期:一维数组(二)和二维数组

目录 一、数组的练习 1.1. 顺序表查找 1.2. 二分查找 1.3. 冒泡排序 二、二维数组 2.1. 二维数组的性质 2.2. 不规则二维数组 一、数组的练习 1.1. 顺序表查找 题目描述:给定一个数组, 再给定一个元素, 找出该元素在数组中的位置。 利用for循环去遍历数组&am…

听一听语音助手的声音

分享自制树莓派语音助手的博文也有一些日子了,今天咱们来听听语音助手自己的声音。 上图是本次对话的log记录,从图上可以看到,主要的对话耗时是用于录音(默认5秒)和语音识别(平均5秒)这两个组件…

【数据结构】包装类简单认识泛型-Java

包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都给了一个包装类型 基本数据类型和对应的包装类 基本数据类型包装类ByteByteshortShortint Integer longLongfloatFloatdoubleDoublec…

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下,金融行业的转型升级是热门话题,创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展,它们与金融领域的深度融合,正引领着新型…

模型的部署:服务端与客户端建立连接(Flask)

目录 一、服务端部署(使用Flask) 1.安装Flask 2.加载模型(这里以识别图片的类型模型为例) 3.定义API端点 4.运行Flask应用 二、客户端请求 1.安装HTTP客户端库 2.发送请求 请求成功示例: 监控与日志 总结 在…

物联网消息队列Emqx日志配置及日志追踪以及Centos7上的rc.local开机不执行、git提交的小问题

一、物联网消息队列Emqx日志配置及日志追踪 EMQX支持将日志输出到控制台或者日志文件,或者同时使用两者。使用 Docker 部署 EMQX,默认只能通过 docker logs 命令查看 EMQX 日志。EMQX 的默认日志级别为 warning,默认在单日志文件超过10MB(log…

nginx 隐藏版本号与WEB服务器信息

nginx 隐藏版本号与WEB服务器信息 1.安装相关软件2.下载软件包解压并进入3.修改C文件4.编译配置./configure --prefix/usr/local/nginx5.编译安装make && make install5.1.错误处理15.2.错误处理25.2.编译安装make && make install 6.修改nginx配置文件,http节…

【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用

上篇文章: 【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间&…

从0开始深度学习(20)——延后初始化和自定义层

一般情况下,模型参数在被创建时就被立即初始化了,但如果使用了延后初始化技术,就能在首次传入数据后,再初始化参数,旨在输入维度未知的情况下,预定义灵活的模型,动态推断各个层的参数大小。 有时…

robosense 激光雷达安装

官方github 1、ROBOSENSE 驱动安装并运行 1、改雷达型号 2、修改网口地址 3、改变点的类型 https://github.com/RoboSense-LiDAR/rslidar_sdk/blob/main/doc/howto/05_how_to_change_point_type.md 2、ROBOSENSE 点云转换成 velodyne git clone https://github.com/HVikto…

Linux 部署 Harbor 镜像仓库详解

文章目录 安装 Docker安装 Harbor访问 Harbor 安装 Docker 本次部署流程使用的是1台阿里云ECS: Ubuntu 22.04,2核4G开放 9999 端口号 首先需要做的是在当前服务器上,安装好 Docker,参考链接如下: https://blog.csdn.n…