2013-04-27 9 views
8

में बार बार प्लॉट को गतिशील रूप से अपडेट करना मेरे पास रास्पबेरी पीआई से जुड़े कई सेंसर हैं; मैं टीसीपी का उपयोग कर अपने पीसी पर दो बार एक बार अपने डेटा भेज रहा हूं। मैं matplotlib का उपयोग कर इन मूल्यों को लगातार ग्राफ करना चाहता हूं।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() 

उत्तर

16

आप animation.FuncAnimation का उपयोग कर सकते हैं। प्लॉट बार साजिश एक बार और वापसी मान, जो rects का एक संग्रह है को बचाने:

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 एक मजबूर विकल्प नहीं है, मैं सर्वर पर एक वेब सॉकेट आधारित पुश प्रणाली और क्लाइंट साइड के लिए एक जावास्क्रिप्ट आधारित अंकन की सिफारिश करेंगे: निम्नलिखित मेरे वर्तमान कोड है। मैं पहली बार में कुछ फायदे सूची जाएगा:

  1. ग्राहक (अपने अन्य पीसी) केवल एक आधुनिक वेब ब्राउज़र स्थापित किया है और किसी भी ऑपरेटिंग सिस्टम चला सकते हैं और अजगर की आवश्यकता नहीं है होना आवश्यक है, matplotlib स्थापित
  2. WebSockets के बाद से होगा एक ब्रॉडकास्ट फैशन में काम करते हैं, आप किसी भी संख्या में एक ही फीड का उपयोग कर सकते हैं, उपयोगकर्ताओं को आपके सिस्टम का डेमो होने पर बहुत उपयोगी हो सकता है
  3. क्लाइंट साइड कोड भी कुशल है, यह पिछले 'एक्स' मानों को बरकरार रखता है और रीयलटाइम में अच्छी तरह से काम करता है, इसलिए सबकुछ को फिर से खींचा जाना नहीं है

चूंकि मैं अपने रास्पबेरी पी के साथ कुछ ऐसा ही कर रहा हूं, इसलिए मैं इसका विवरण साझा कर सकता हूं। यह this ब्लॉग पोस्ट से प्रेरित है। सर्वर पक्ष के लिए कोड जो डेटा को धक्का देता है here पाया जा सकता है। आप शायद देख सकते हैं कि निर्भरताओं को स्थापित करने के बाद, यह आपके कोड के समान ही है और अंततः आपको मेरे कोड में socket.send() भी मिलेगा। क्लाइंट साइड के लिए, this HTML फ़ाइल का लिंक है और this वह जेएस है जो ब्राउज़र पर निष्पादित हो जाता है, जो Flot प्लॉटिंग लाइब्रेरी का उपयोग करता है। मुझे यकीन है कि उनके होम पेज पर डेमो ध्यान देने योग्य है!

+0

इसके लिए बहुत धन्यवाद, मैं इसे अपग्रेड के रूप में कार्यान्वित करने के लिए देखता हूं। हालांकि, मैं अभी भी जानना चाहूंगा कि क्या मेरे मूल मुद्दे पर एक सरल फिक्स के रूप में matplotlib चार्ट को समाशोधन के बिना अपडेट करना है? – hfaran