2013-09-13 23 views
10

Tôi đang đọc dữ liệu từ một ổ cắm trong một chuỗi và muốn vẽ và cập nhật cốt truyện khi dữ liệu mới đến. Tôi được mã hóa lên một nguyên mẫu nhỏ để mô phỏng điều nhưng nó không hoạt động:Bạn có thể vẽ dữ liệu trực tiếp trong matplotlib không?

import pylab 
import time 
import threading 
import random 

data = [] 

# This just simulates reading from a socket. 
def data_listener(): 
    while True: 
     time.sleep(1) 
     data.append(random.random()) 

if __name__ == '__main__': 
    thread = threading.Thread(target=data_listener) 
    thread.daemon = True 
    thread.start() 

    pylab.figure() 

    while True: 
     time.sleep(1) 
     pylab.plot(data) 
     pylab.show() # This blocks :(
+0

http://stackoverflow.com/questions/14665636/time-sleep-required-to-keep-qthread-responsive – tacaswell

+0

http://stackoverflow.com/questions/8955869/why-is-plotting-with-matplotlib -so-slow/8956211 # 8956211 – tacaswell

+0

http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib/15724978#15724978 – tacaswell

Trả lời

9
import matplotlib.pyplot as plt 
import time 
import threading 
import random 

data = [] 

# This just simulates reading from a socket. 
def data_listener(): 
    while True: 
     time.sleep(1) 
     data.append(random.random()) 

if __name__ == '__main__': 
    thread = threading.Thread(target=data_listener) 
    thread.daemon = True 
    thread.start() 
    # 
    # initialize figure 
    plt.figure() 
    ln, = plt.plot([]) 
    plt.ion() 
    plt.show() 
    while True: 
     plt.pause(1) 
     ln.set_xdata(range(len(data))) 
     ln.set_ydata(data) 
     plt.draw() 

Nếu bạn muốn đi thật nhanh, bạn nên xem xét blitting.

+0

Tôi cũng đang tìm cách hiển thị biểu đồ phát trực tuyến. Tôi đã thử đoạn mã này và có đối tượng "AttributeError: 'module' không có thuộc tính 'figure'". Sau đó, tôi đã cố gắng để "nhập khẩu matplotlib.pylab như plt" thay vì pylab và có "RuntimeError: xdata và ydata phải có cùng độ dài". Có điều gì đó sai trái với môi trường của tôi? Tôi đang sử dụng Python 2.7 –

+0

@GregDan Xem các chỉnh sửa. – tacaswell

+0

Cảm ơn. Cái này tốt hơn ... chỉ cần thêm ")" tại ln.set_xdata (phạm vi (len (dữ liệu)) –

-1

f.show() không chặn, và bạn có thể sử dụng draw để cập nhật hình.

f = pylab.figure() 
f.show() 
while True: 
    time.sleep(1) 
    pylab.plot(data) 
    pylab.draw() 
+2

'show' chỉ không bị chặn nếu chế độ tương tác là trên – tacaswell

Các vấn đề liên quan