2011-11-21 28 views
5

Tôi hiểu cách hiển thị các ô matplotlib trên màn hình bằng giao diện pyplot (tôi nghĩ vậy!). Tôi bắt đầu vẽ đồ thị trong một chương trình đa luồng, và điều này bắt đầu gây ra lỗi, vì vậy tôi đang cố gắng chuyển sang giao diện hướng đối tượng. Tôi có thể tạo một âm mưu đơn giản và lưu vào tệp bằng cách sử dụngVẽ các ô trên màn hình bằng cách sử dụng matplotlib API

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 

fig = Figure() 
can = FigureCanvas(fig) 
ax = fig.add_subplot(111) 
ax.plot((1,2,3)) 
can.print_figure('test') 

Nhưng làm cách nào để hiển thị cốt truyện này trên màn hình? Tôi đã thấy mã khác sử dụng can.draw() nhưng không có hiệu lực.

Ngoài ra, vui lòng cho tôi biết nếu có bất kỳ điều gì tối ưu về mã của tôi ở trên - tôi chưa thực sự hiểu thấu tất cả các đối tượng hình, canvas và trục này.

Trả lời

4

Vấn đề của bạn là bạn đang sử dụng chương trình phụ trợ không tương tác (Agg thay vì TkAgg, GtkAgg, QtAgg, v.v ...). Theo định nghĩa, nó không hỗ trợ hiển thị cho màn hình.

Tuy nhiên, việc làm việc với mã đa luồng với bất kỳ thư viện gui nào cũng sẽ yêu cầu luồng chính của gui được chạy trong chuỗi riêng của nó.

Nói cách khác, việc chuyển sang chương trình phụ trợ có thể hiển thị trên màn hình sẽ yêu cầu độ phức tạp cao hơn một chút trong mã đa luồng của bạn.

Có một số cách khác nhau để thực hiện việc này, nhưng bất kỳ phương pháp chung nào cũng sẽ không hiệu quả. (Giải pháp đơn giản là sử dụng pyplot.ion và sau đó vẽ canvas mỗi x mili giây trong một thread trong khi làm những việc khác trong chủ đề khác. Đây là khủng khiếp không hiệu quả.)

Bạn có thể cho một chút chi tiết hơn về những gì bạn' đang làm gì? Tại sao bạn sử dụng luồng thay vì đa xử lý? (tức là bạn chỉ làm rất nhiều IO?) Bạn đang sử dụng thư viện gui nào? (Nếu bạn không biết, thì có thể là Tk, vì đó là phụ trợ matplotlib mặc định.)

+0

Cảm ơn rất nhiều sự giúp đỡ của bạn. Tôi đã không nhận ra câu trả lời sẽ được cụ thể cho các phụ trợ (tôi đã cố gắng để làm việc ra những gì 'pyplot.show()' đã làm, nhưng không tìm thấy mã có liên quan). Tôi tìm thấy [this] (http://matplotlib.sourceforge.net/examples/user_interfaces/embedding_in_tk.html) ví dụ cho Tk, rất hữu ích. Đề cập đến đa luồng có lẽ là cá trích đỏ - tôi chỉ có một số mã đã thực hiện một số con số-crunching và lưu một số mảnh với pyplot, tôi đã thử chuyển nó thành một chuỗi để tôi có thể xem kết quả của nó trong khi nó đang chạy, và có rất nhiều điều kỳ lạ lỗi. – James

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