2013-04-27 10 views
8

私は自分のラズベリーパイに数多くのセンサーを接続しています。私はTCPを使って自分のPCにデータを2秒間送っています。 matplotlibを使ってこれらの値をグラフにしたいと思います。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を使用できます。 rect.set_heightを呼んで、バーの高さを変更するには、次に

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

:一度とRectsの集まりである戻り値を、保存 プロットバープロットを

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のは強制できない場合は、私は、サーバーとクライアント側用のJavascriptベースの作図上のWebソケットベースのプッシュシステムをお勧めします。私は、最初のいくつかの利点が一覧表示されます:

  1. をクライアント(あなたの他のPCで)のみ最新のWebブラウザがインストールされている必要がありますし、任意のOSを実行することができますし、Pythonを持っている必要はありません、matplotlibのは、WebSocketをするので
  2. をインストールしますブロードキャストで作業することで、任意の数のクライアントが同じフィードを使用できるようになり、ユーザーにシステムのデモを許可しながら非常に便利になります。
  3. クライアントサイドのコードも効率的です。リアルタイムでうまくいくので、すべてを再描画する必要はありません。

私はラズベリーパイと非常に似たようなことをしているので、同じことについて私の詳細を分かち合うことができます。ブログ記事thisに触発されています。 データをプッシュするサーバー側のコードはhereです。依存関係をインストールした後は、コードと非常によく似ていて、最終的にコード内にもsocket.send()があることがわかります。 クライアント側では、thisはHTMLファイルへのリンクであり、thisはブラウザで実行されるJSであり、Flotプロットライブラリを使用します。私は彼らのホームページのデモが注目に値するほど素晴らしいと確信しています!

+0

多くのありがとう、私はこれをアップグレードとして実装しようとします。しかし、私はまだクリアしないでmatplotlibのグラフを更新することで私の元の問題に単純な修正があるかどうか知りたいですか? – hfaran

関連する問題