Динамическое обновление полосы в matplotlib

У меня есть несколько датчиков, прикрепленных к моей Малиновой Пи; Я отправляю свои данные на свой компьютер два раза в секунду, используя TCP. Я хотел бы постоянно графически отображать эти значения, используя matplotlib.

Метод, который я использую в настоящее время, кажется неэффективным (я очищаю подзаголовок и каждый раз перерисовываю его) и имеет некоторые нежелательные недостатки (масштабирование настраивается каждый раз, я бы хотел, чтобы он оставался от 0.0 до 5.0). Я знаю, что есть способ сделать это без необходимости очищать и перерисовывать, но, похоже, не может понять это. Ниже приведен мой текущий код:

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() 

2 Solutions collect form web for “Динамическое обновление полосы в matplotlib”

Вы можете использовать animation.FuncAnimation . animation.FuncAnimation . Разделите график штрихов один раз и сохраните возвращаемое значение, которое представляет собой коллекцию Rect:

 rects = plt.bar(range(N), x, align='center') 

Затем, чтобы изменить высоту бара, вызовите rect.set_height :

  for rect, h in zip(rects, x): rect.set_height(h) 

 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation def animate(frameno): x = mu + sigma * np.random.randn(N) n, _ = np.histogram(x, bins, normed=True) for rect, h in zip(patches, n): rect.set_height(h) return patches N, mu, sigma = 10000, 100, 15 fig, ax = plt.subplots() x = mu + sigma * np.random.randn(N) n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75) frames = 100 ani = animation.FuncAnimation(fig, animate, blit=True, interval=0, frames=frames, repeat=False) plt.show() 

Если matplotlib не является принудительным вариантом, я бы порекомендовал систему Push Socket на сервере и основанную на Javascript графику для клиентской стороны. Сначала я перечислю несколько преимуществ:

  1. Клиент (ваш другой компьютер) должен иметь только современный веб-браузер и может запускать любую ОС и не должен иметь Python, Matplotlib установлен
  2. Поскольку WebSockets будет работать в режиме широковещания, вы можете использовать любое количество клиентов для одного и того же фида, может быть очень полезным, позволяя пользователям иметь демонстрацию вашей системы
  3. Клиентский код также эффективен, он сохраняет последние значения «х» и хорошо работает в режиме реального времени, поэтому все не нужно перерисовывать

Так как я делаю что-то очень похожее на мой малиновый Pi, я могу поделиться своими подробностями. Это вдохновляет этот пост в блоге. Код для серверной стороны, который подталкивает данные, можно найти здесь . Вероятно, вы увидите, что после установки зависимостей он очень похож на ваш код, и в конце концов вы найдете socket.send() даже в моем коде. Для клиентской стороны это ссылка на файл HTML, и это JS, который запускается в браузере, который использует библиотеку Flot Plotting. Я уверен, что демо на их домашней странице достаточно удивительно, чтобы его заметили!

  • Почему многие примеры используют «fig, ax = plt.subplots ()» в Matplotlib / pyplot / python
  • Jupyter Notebook: интерактивный сюжет с виджетами
  • Matplotlib исчерпывает память при построении графика в цикле
  • Установка тета-тиков в полярных графиках matplotlib
  • Сохранение матрицы matplotlib / networkx без полей
  • Может ли Numpy's frompyfunc () вернуть изображение?
  • matplotlib: изменить текущий экземпляр оси (т.е. gca ())
  • Как сделать «более полные» стрелки оси с помощью matplotlib
  • Python - лучший язык программирования в мире.