Python实时绘制Matplotlib图表

2024-04-24 15:36:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python中的微控制器绘制通过USART串行总线接收的几个数据。如果我能并行实时地绘制所有数据就好了。在

当我使用单次绘图时,数据是实时绘制的,但当我使用子图时,数据会有越来越多的延迟,如果我只绘制一个子通道。有人知道为什么python中的子批处理慢得多吗?在

我还测量了update()函数的时间消耗,它似乎小于等于2ms。我每5毫秒或更长时间才收到一次数据。如何提高速度?在

谨致问候:塞巴斯蒂安T

这是我的密码

import serial
import matplotlib.pyplot as plt
import matplotlib.animation as anim
import time
from collections import deque

#SERIAL#######################################################
try:
    ser = serial.Serial()
    ser.baudrate=115200;
    ser.port = 'COM7'
    ser.open()
except:
    ser.close()
    print('Problem occured')

ser.flushInput()
ser.flushOutput()

#PLOT##########################################################

MAX_X = 250   #width of graph
MAX_Y = 70000  #height of graph

# intialize line to horizontal line on 0
line1 = deque([0.0]*MAX_X, maxlen=MAX_X)
line2 = deque([0.0]*MAX_X, maxlen=MAX_X)
line3 = deque([0.0]*MAX_X, maxlen=MAX_X)
line4 = deque([0.0]*MAX_X, maxlen=MAX_X)
line5 = deque([0.0]*MAX_X, maxlen=MAX_X)

plt.close('all')
fig, (ax1,ax2,ax3,ax4) = plt.subplots(4,1)

l1, = ax1.plot([], [])
l2, = ax2.plot([], [])
l3, = ax3.plot([], [])
l4, = ax4.plot([], [])

l=[l1,l2,l3,l4]

for ax in [ax1,ax2,ax3,ax4]:
    ax.set_ylim(-(MAX_Y/2),MAX_Y/2)
    ax.set_xlim(-(MAX_X/2),MAX_X/2)
    ax.grid()

def update(fn, data):
    try:
        t = time.time()
        #prepare Data
        data_raw = ser.readline()
        data_raw = data_raw.split(',')
        data_raw = data_raw[1::2]

        #Update Plots
        line1.append(int(data_raw[0]))
        line2.append(int(data_raw[1]))
        line3.append(int(data_raw[2]))
        line4.append(int(data_raw[3]))

        #Set Data
        l[0].set_data(range(-MAX_X/2, MAX_X/2), line1)
        l[1].set_data(range(-MAX_X/2, MAX_X/2), line2)
        l[2].set_data(range(-MAX_X / 2, MAX_X / 2), line3)
        l[3].set_data(range(-MAX_X / 2, MAX_X / 2), line4)
        print(time.time() - t)

    except:
        print('exception')
        ser.close()

ani = anim.FuncAnimation(fig,update,fargs=(0,),frames=1, interval=100)
plt.show()

Tags: 数据importdatarawtimeplot绘制plt
1条回答
网友
1楼 · 发布于 2024-04-24 15:36:05

如果绘制的数据点数量增加,这是一个已知的问题。 我从一个D/a转换器实时绘制数据,在大约500个绘图点后必须用cla()清除轴。在

原因是一直调用“def update”会完全更新包含所有绘图点的整个图形…这是clar越来越不理想的表现

向眼镜蛇医生问好

相关问题 更多 >