Ho un numero di sensori collegato al mio Raspberry Pi; Sto inviando i loro dati al mio PC due volte al secondo usando TCP. Mi piacerebbe graficare continuamente questi valori usando matplotlib.Aggiornamento dinamico di un grafico a barre in matplotlib
Il metodo Attualmente sto usando sembra inefficiente (sto aprendo la sottotrama e ridisegnando ogni volta) e ha alcuni inconvenienti indesiderati (la scala viene riadattato ogni volta, mi sarebbe piaciuto rimanere 0,0-5,0). So che c'è un modo per farlo senza dover cancellare e ridisegnare, ma non riesco a capirlo. Quello che segue è il mio codice corrente:
import socket
import sys
import time
from matplotlib import pyplot as plt
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect the socket to the port where the server is listening
server_address = ('192.168.0.10', 10000)
print >>sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)
# Initial setup for the bar plot
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
x = [1,2,3]
labels = ['FSR', 'Tilt', 'IR']
ax.set_xticklabels(labels)
y = [5.0,5.0,5.0]
ax.bar(x,y)
fig.autofmt_xdate()
plt.draw()
#Grab and continuously plot sensor values
try:
for i in range(300):
amount_received = 0
amount_expected = len("0.00,0.00,0.00")
# Receive data from RasPi
while amount_received < amount_expected:
data = sock.recv(14)
amount_received += len(data)
print >>sys.stderr, 'received "%s"' % data
# Plot received data
y = [float(datum) for datum in data.split(',')]
ax.clear()
ax.bar(x,y)
plt.draw()
time.sleep(0.5)
#Close the socket
finally:
print >>sys.stderr, 'closing socket'
sock.close()
Mille grazie per questo, cercherò di implementarlo come aggiornamento. Tuttavia, vorrei ancora sapere se esiste una semplice soluzione al mio problema originale con l'aggiornamento del grafico matplotlib senza compensazione? – hfaran