0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​效果图​​
  • ​​源代码​​

效果图

【案例】matplotlib 实时动态绘制多条曲线_ico
【案例】matplotlib 实时动态绘制多条曲线_随机数_02
【案例】matplotlib 实时动态绘制多条曲线_python_03

纵坐标中的数据比较密集,不过不碍事,这个 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()


举报

相关推荐

0 条评论