2013-04-27 4 views
8

라즈베리 파이에 연결된 센서가 여러 개 있습니다. 나는 그들의 데이터를 TCP를 사용하여 초당 2 번 내 PC로 보냈다. matplotlib를 사용하여이 값을 지속적으로 그래프로 나타내고 싶습니다.matplotlib의 바 플롯을 동적으로 업데이트합니다.

현재 사용중인 메서드는 비효율적 인 것처럼 보입니다 (서브 Plot을 지우고 다시 그릴 때마다) 그리고 몇 가지 바람직하지 않은 단점이 있습니다 (규모가 매번 재조정 됨, 0.0 - 5.0에서 유지하고 싶습니다). 나는 명확하게하고 다시 그릴 필요없이 이것을하는 방법이 있지만 알아낼 수는 없다는 것을 알고있다. 하기 matplotlib가 강제 옵션이없는 경우

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

답변

16

animation.FuncAnimation을 사용할 수 있습니다. 플롯 막대 그래프 번이의 구형의 모음입니다 반환 값 저장 :

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

, 난 서버의 웹 소켓 기반의 푸시 시스템 및 클라이언트 측 자바 스크립트 기반 플로팅를 추천 할 것입니다 : 다음은 내 현재 코드입니다. 하고자하기 matplotlib가 WebSocket을하기 때문에

  • 를 설치, 단지 최신 웹 브라우저가 설치되어있는 OS를 실행할 수 있습니다 파이썬이 필요하지 않습니다 있어야합니다

    1. 클라이언트 (다른 ​​PC) : 내가 먼저 몇 가지 장점을 나열합니다 방송 방식으로 작업 할 수 있습니다. 클라이언트 수에 관계없이 동일한 피드를 사용할 수 있으며 사용자에게 시스템 데모가있는 동안 매우 유용 할 수 있습니다.
    2. 클라이언트 측 코드도 효율적이며 마지막 'x'값을 유지하며 실시간으로 잘 작동하므로 모든 것을 다시 그릴 필요가 없습니다.

    나는 라즈베리 파이와 아주 비슷한 것을하고 있기 때문에, 나는 나의 세부 사항을 공유 할 수있다. 블로그 게시물 this에서 영감을 얻었습니다. 데이터를 푸시하는 서버 측 코드는 here입니다. 의존성을 설치 한 후에 코드와 매우 유사하므로 결과적으로 내 코드에 socket.send()이 있다는 것을 알 수 있습니다. 클라이언트 측의 경우 this은 HTML 파일에 대한 링크이고 this은 브라우저에서 실행되는 JS이며 Flot 플로팅 라이브러리를 사용합니다. 나는 그들의 홈 페이지의 데모가 주목할만큼 굉장하다는 것을 확신합니다!

  • +0

    많은 분들께 감사 드리며, 업그레이드로 구현하겠습니다. 그러나, 나는 여전히 지워지지 않고 matplotlib 차트를 업데이트하는 내 원래의 문제에 대한 간단한 수정으로 거기에 있는지 알고 싶습니다? – hfaran

    관련 문제