Как обновить график matplotlib в реальном времени с помощью данных с датчика?

#python #matplotlib #plot #raspberry-pi #raspberry-pi3

Вопрос:

Я пытаюсь прочитать напряженность магнитного поля в Python, используя доску sense hat с raspberry pi 3b , и пытаюсь построить данные в реальном времени.

Если быть более точным, у меня есть 3 показания, сила поля по осям x, y и z датчика.

Поэтому мне нужно иметь три графика по одному для каждой силы оси. На этих графиках ось x должна «перемещаться» или обновляться, чтобы на чертеже отображался только определенный объем данных (скажем, последние 20 секунд показаний). Как в этом примере

До сих пор мне удавалось создавать три графика и считывать данные в режиме реального времени. Мои графики и код выглядят так:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
from sense_hat import SenseHat
import time
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
sense = SenseHat()
sense.clear()

x = []
y = []
z = []


# Our actual plot objects
#figures, (ax1, ax2, ax3) = plt.subplots(3, sharex=True, sharey=True)
figures, (ax1, ax2, ax3) = plt.subplots(3)
figures.suptitle("measures")

#ax1.set_title("X")
line, = ax1.plot(x, y, 'tab:orange')
ax1.axis([0,100, -400, 400])

#ax2.set_title("Y")
line2, = ax2.plot(x, y, 'tab:green')
ax2.axis([0,100, -400, 400])

#ax3.set_title("Z")
line3, = ax3.plot(x, y, 'tab:red')
ax3.axis([0,100, -400, 400])

#plt.axis([0, 4*np.pi, -4900, 4900])



def read_magneto(i):
    raw = sense.get_compass_raw()
    #print("x={x}uT y={y}uT z={z}uT".format(**raw))

    # These are the readings from the sensor
    Xreading = raw['x']
    Yreading = raw['y']
    Zreading = raw['z']

    x.append(Xreading)
    y.append(Yreading)
    z.append(Zreading)

    line.set_data(x, i)
    line2.set_data(y, i)
    line3.set_data(z, i)
    #print("i: " str(i))
    return line,


# Our animation object
ani = FuncAnimation(figures,
                read_magneto,
                frames=30,
                interval=1)

# show plot
plt.show()
 

введите описание изображения здесь

Используя line.set_data(x, i) я думал, что мои показания по оси x будут нанесены на ось x графика, в то время как я буду осью y. Однако это работает не так, как я ожидал. Как я могу это исправить? Я ожидал, что сюжеты будут выглядеть примерно так:

введите описание изображения здесь

Спасибо