2014-11-13 27 views
7

Tôi muốn các nút và các đối tượng tương tác khác của matplotlib xuất hiện từ bên trong sổ ghi chép ipython của tôi. screenshotipython máy tính xách tay trên máy ảo linux chạy matplotlib tương tác với nbagg

Đây là những gì tôi đã thực hiện:

  1. cài đặt http://datasciencetoolbox.org, đó là một hộp lang thang với ipython cài đặt và phiên bản 1.3.1 của matplotlib.

  2. Tôi cần nâng cấp matplotlib lên phiên bản mới nhất, vì nó có khả năng thực hiện các lô tương tác nội tuyến này. What's new in Matplotlib 1.4.1
    Tôi cần chạy sudo apt-get install pkg-config
    sudo pip install matplotlib --upgrade để thực hiện điều đó.

  3. Sau đó, để tạo ra (ví dụ: lỗi) ảnh chụp màn hình đẹp dưới đây, tôi đi vào các tập tin .ipython/dst-profile/ipython_notebook_config.py và xóa dòng về IPKernelApp.pylab='inline' để có thể chạy lệnh matplotlib.use('nbagg').

  4. Sau đó, tôi có thể tạo ảnh chụp màn hình bên dưới. Tuy nhiên, mọi thứ vẫn trông nghèo nàn. Các nút đó không phải là nút. Đó là một hình ảnh của các nút. Hãy tư vấn về cách làm cho các nút đó trở nên sống động!

Oh ... và kiểm tra this nếu điều này giúp bạn giúp tôi.

Cảm ơn!

screenshot

+0

Ngoài ra, nếu bạn chỉ nhắm mục tiêu vào sổ ghi chú cho các ô tương tác, bạn có thể làm tốt hơn bằng cách sử dụng '@ interact' là một số ma thuật đen làm cho bạn tiện ích con javascript tương tác. – tacaswell

+0

@tcaswell, chính xác tôi sẽ sử dụng @interact như thế nào? – user3659451

+0

Tra cứu tài liệu, tôi chưa bao giờ thực sự sử dụng nó chỉ xem demo – tacaswell

Trả lời

6

Về cơ bản bạn đang phải đối mặt với hai vấn đề

  • cuộc gọi %pylab inline đè matplotlib.use('nbagg') cuộc gọi, sử dụng inline backend thay cho nbagg backend mà bạn đang thực sự mong muốn. Nếu bạn sử dụng phiên bản IPython (2.3) gần đây, bạn có thể trực tiếp sử dụng %matplotlib nbagg (hoặc %matplotlib notebook) để tải phụ trợ nbagg thay vì cuộc gọi %pylab của bạn.

  • sau khi bạn bật phụ trợ nbagg bạn sẽ cần hiển thị rõ ràng, ví dụ: bổ sung một ghé plt.show() ở phần cuối của kịch bản của bạn ->Cập nhật: với IPython 2.3.1 này không còn cần thiết (nhờ @tcaswell cho gợi ý)

Với điều này bạn sẽ có được những trải nghiệm tương tác matplotlib nhúng trong sổ ghi chép IPython. Tuy nhiên, việc thử mã nhanh của bạn không mang lại kết quả mong muốn. Nút phản ứng và cuộc gọi lại được thực hiện nhưng cuộc gọi print không hiển thị bất cứ điều gì. Dù sao, để thấy rằng nó hoạt động, hãy thử ví dụ đơn giản sau đây (yêu cầu IPython 2.3):

%matplotlib nbagg 
from matplotlib.widgets import Button 
import matplotlib.pyplot as plt 
def callback(event): 
    plt.text(event.xdata, event.ydata, 'clicked') 

f,a = plt.subplots(1) 
b1 = Button(a,'Button1') 
b1.on_clicked(callback) 
plt.show() 

Btw. bạn nên sử dụng% matplotlib thay vì% pylab vì sau đó dẫn đến một số tác dụng phụ, xem here.

+0

Sự cần thiết rõ ràng để gọi hiển thị nên được cố định bởi một số kết hợp của nâng cấp mpl/ipython, nhưng tôi không chắc chắn như thế nào đến nay (xem https://github.com/ipython/ipython/pull/6587). 1 trên không sử dụng giá treo, chúng tôi không thể _actually_ xóa nó khỏi nguồn, nhưng đang làm việc để xóa nó khỏi tài liệu (cả mpl + IPython) – tacaswell

+0

Tôi đã nâng cấp ipython kể từ bài đăng gốc này: https: // www. dropbox.com/s/co17ndyts0v8a4q/Screenshot%202014-11-13%2013.04.15.png?dl=0, sau đó tôi đã chỉnh sửa tệp cấu hình sổ ghi chép của mình. https://www.dropbox.com/s/ox1i4k5vl355e06/Screenshot%202014-11-13%2013.14.30.png?dl=0 cuối cùng, tôi đã khởi động sổ ghi chép mới và chạy mã của bạn mà không cần mã đầu tiên dòng và cuối cùng (vì vậy không có 'plt.show()'): https://www.dropbox.com/s/wyy0wosbkupnbtg/Screenshot%202014-11-13%2013.18.14.png?dl=0 – user3659451

+0

Vì vậy, giải quyết điều plt.show tcaswell, và nó xử lý vấn đề của tôi mà tôi đã dành hơn 5 giờ mày mò với. Bây giờ tôi cuối cùng có thể sử dụng máy tính xách tay ipython với các ô tương tác! Yay. Cảm ơn @Jakob. – user3659451

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