栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【案例】matplotlib 实时动态绘制多条曲线

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【案例】matplotlib 实时动态绘制多条曲线

文章目录
    • 效果图
    • 源代码

效果图





纵坐标中的数据比较密集,不过不碍事,这个 GIF 主要想要说明程序运行效果。


源代码

程序应该很好理解,请忽略我设置的全局参数,这些不重要,程序逻辑很清楚。

import random
from math import pi, sin
import threading
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
from scipy import signal

#用于显示正常中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#用于正常显示负号
plt.rcParams['axes.unicode_minus'] = False

RANGE = 1000
START_Y = 0
END_Y = 1000
FREQUENCY = 10
KEY = 0
LastDistance = -1
Jitter_Threshold = 20
onlyonce = 0

fig = plt.figure()
ax = plt.axes(xlim=(0, RANGE), ylim=(0, RANGE))
# ax.legend(loc='best')
ax.grid(axis='both')
x_ticks = np.arange(0, RANGE, 5*FREQUENCY)
y_ticks = np.arange(0, RANGE, 2*FREQUENCY)
plt.xticks(x_ticks)
plt.yticks(y_ticks)
x_line = [i for i in range(0, RANGE)]
y_line = [0.0 for i in range(0, RANGE)]
x_sin_line = [i for i in range(0, RANGE)]
y_sin_line = [0.0 for i in range(0, RANGE)]
x_square_line = [i for i in range(0, RANGE)]
y_square_line = [0.0 for i in range(0, RANGE)]
plt.ylim(bottom=START_Y, top=END_Y)

line, = plt.plot(x_line, y_line, linestyle='-', label='Real-time curve', linewidth=1, color='blue')
line_sin, = plt.plot(x_sin_line, y_sin_line, linestyle='-', label='', linewidth=1, color='red')
line_square, = plt.plot(x_square_line, y_square_line, linestyle='-', label='', linewidth=1, color='green')
text_ani = plt.text(900, 750, '', ha='center', va= 'bottom', fontsize=20)

sinx_g = None # data_from_sinx(A=1, w=1, f=0, h=0, step=1000) generator
square_wave_g = None

def draw():
    def update(c):
        x_line = [i for i in range(0, RANGE)]
        # 绘制随机数曲线
        distance = data_from_random()
        y_line.pop(-1)
        y_line.insert(0, distance)
        line.set_data(x_line, y_line)

        # 绘制sin曲线,需要注意return
        x_sin_line = [i for i in range(0, RANGE)]
        y_sin_line.pop(-1)
        y_sin_line.insert(0, sinx_g.__next__()[1])
        line_sin.set_data(x_sin_line, y_sin_line)

        # 绘制方波曲线,需要注意return
        x_square_line = [i for i in range(0, RANGE)]
        y_square_line.pop(-1)
        y_square_line.insert(0, square_wave_g.__next__()[1])
        line_square.set_data(x_square_line, y_square_line)

        # 显示当前数值
        text_ani.set_text("d= %.3f" % distance)

        return line, line_sin, line_square, text_ani # 将需要动态变化的内容return即可
    anim = animation.FuncAnimation(fig=fig, func=update, interval=FREQUENCY, blit=True)
   
    anim.save("text.gif", writer='pillow')
    plt.show()

def data_from_square_wave(A=100, hz=20, h=0, step=1000):
    """
    A: 振幅
    hz:频率
    h:位移高度
    """
    t = 0
    y = 0
    while True:
        y = signal.square(2 * np.pi * hz * t)
        yield t, A*y + h
        t += 1/step

def data_from_sinx(A=1, w=1, f=0, h=0, n=0, step=1000):
    """
    @param A: 振幅
    @param w: 频率 弧度制
    @param f: 相位 弧度制
    y = Asin(wx+f)
    """
    x = -2*pi
    while True:
        x += 1/step
        y = pow(A*sin(w*x + f) + h, n)
        yield x, y


def data_from_random():
    """
    返回[0, 500]间的随机整数
    """
    return random.randint(0, 500)

if __name__ == "__main__":
    sinx_g = data_from_sinx(A=50, w=4*pi, f=0, h=(START_Y+END_Y)/2+START_Y, n=1, step=1000)
    square_wave_g = data_from_square_wave(A=100, hz=20, h=(START_Y+END_Y)/2+START_Y, step=1000)
    threading.Thread(target=draw()).start()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323784.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号