python画图|曲线动态输出

【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() #输出图形

此时获得的输出结果为:

++图1++

此时对应的完整代码为:

python 复制代码
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上运行上述代码时,输出的图形是无限的,不会停止。

++图2++

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

【3】代码改写

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

复制代码
if(t>20):
    break

此时的完整代码为:

python 复制代码
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:

++图3++

【4】总结

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

相关推荐
databook11 分钟前
概率图模型:机器学习的结构化概率之道
python·机器学习·scikit-learn
拾回程序猿的圈圈∞14 分钟前
实战二:开发网页端界面完成黑白视频转为彩色视频
python·ai编程
亚林瓜子16 分钟前
AWS Elastic Beanstalk + CodePipeline(Python Flask Web的国区CI/CD)
python·ci/cd·flask·web·aws·beanstalk·codepipeline
春末的南方城市17 分钟前
中山大学&美团&港科大提出首个音频驱动多人对话视频生成MultiTalk,输入一个音频和提示,即可生成对应唇部、音频交互视频。
人工智能·python·深度学习·计算机视觉·transformer
深科文库1 小时前
构建 MCP 服务器:第 4 部分 — 创建工具
python·chatgpt·prompt·aigc·agi·ai-native
witton1 小时前
美化显示LLDB调试的数据结构
数据结构·python·lldb·美化·debugger·mupdf·pretty printer
SteveDraw2 小时前
C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
开发语言·c++·c#·封装·动态链接库
十五年专注C++开发2 小时前
设计模式之单例模式(二): 心得体会
开发语言·c++·单例模式·设计模式
nenchoumi31192 小时前
AirSim/Cosys-AirSim 游戏开发(一)XBox 手柄 Windows + python 连接与读取
windows·python·xbox
GoodStudyAndDayDayUp2 小时前
初入 python Django 框架总结
数据库·python·django