2016-01-29 23 views
5

Tôi đang cố tạo một bản đồ trực tiếp cập nhật khi có nhiều dữ liệu hơn.Tương tác với cốt truyện matplotlib trực tiếp

import os,sys 
import matplotlib.pyplot as plt 

import time 
import random 

def live_plot(): 
    fig = plt.figure() 
    ax = fig.add_subplot(111) 

    ax.set_xlabel('Time (s)') 
    ax.set_ylabel('Utilization (%)') 
    ax.set_ylim([0, 100]) 
    ax.set_xlim(left=0.0) 

    plt.ion() 
    plt.show() 

    start_time = time.time() 
    traces = [0] 
    timestamps = [0.0] 
    # To infinity and beyond 
    while True: 
     # Because we want to draw a line, we need to give it at least two points 
     # so, we pick the last point from the previous lists and append the 
     # new point to it. This should allow us to create a continuous line. 
     traces = [traces[-1]] + [random.randint(0, 100)] 
     timestamps = [timestamps[-1]] + [time.time() - start_time] 
     ax.set_xlim(right=timestamps[-1]) 
     ax.plot(timestamps, traces, 'b-') 
     plt.draw() 
     time.sleep(0.3) 

def main(argv): 
    live_plot() 

if __name__ == '__main__': 
    main(sys.argv) 

Mã trên hoạt động. Tuy nhiên, tôi không thể tương tác với cửa sổ được tạo bởi plt.show()

Làm cách nào để tôi có thể vẽ dữ liệu trực tiếp trong khi vẫn có thể tương tác với cửa sổ lô?

Trả lời

1

Sử dụng plt.pause() thay vì time.sleep().

Sau đó chỉ đơn giản là giữ thực hiện chủ đề chính và vòng lặp sự kiện GUI không chạy. Thay vào đó, plt.pause chạy vòng lặp sự kiện và cho phép bạn tương tác với hình.

Từ documentation:

Tạm dừng cho giây khoảng thời gian.

Nếu có một con số hoạt động, nó sẽ được cập nhật và hiển thị và vòng lặp sự kiện GUI sẽ chạy trong khi tạm dừng.

Nếu không có hình hoạt động hoặc nếu chương trình phụ trợ không tương tác sử dụng , điều này sẽ thực thi time.sleep (khoảng thời gian).

Note

Vòng lặp sự kiện cho phép bạn tương tác với con số này chỉ chạy trong khoảng thời gian tạm dừng. Bạn sẽ không thể tương tác với hình trong quá trình tính toán. Nếu tính toán mất một thời gian dài (nói 0.5s hoặc nhiều hơn) sự tương tác sẽ cảm thấy "laggy". Trong trường hợp đó, nó có thể có ý nghĩa để cho phép các tính toán chạy trong một chuỗi hoặc quy trình công nhân chuyên dụng.

+0

Tôi đang bối rối .. nếu vòng lặp chỉ chạy trong 'plt.pause()', thì tôi không phải chỉ định khoảng thời gian tạm dừng lớn để đảm bảo rằng nó có thể nhận và xử lý tất cả các lệnh của tôi (chuột kéo - kéo dài/zoom/etc)? Bạn có thể sửa đổi ví dụ của tôi để mô tả những gì bạn có nghĩa là? –

+0

Để lại ví dụ của bạn giống như bây giờ và thay thế 'time.sleep (0.3)' bằng 'plt.pause (0.3)'. Bạn không cần một khoảng thời gian tạm dừng lớn vì bạn có một khoảng thời gian tạm dừng ngắn sau một khoảng thời gian không ngừng nghỉ khác. Nếu mã của bạn dành ít thời gian nhất giữa các lệnh tạm dừng thì mọi thứ sẽ chạy trơn tru. – kazemakase

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