2009-08-02 27 views
9

hành vi Weird, tôi chắc chắn đó là tôi Screwing lên, nhưng tôi muốn tìm hiểu tường tận về những gì đang xảy ra:Python Matplotlib treo khi được yêu cầu vẽ một biểu đồ thứ hai (sau khi đóng đầu tiên cửa sổ biểu đồ)

tôi đang chạy đoạn mã sau để tạo ra một cửa sổ đồ thị rất đơn giản sử dụng matplotlib:

>>> import matplotlib.pyplot as plt 
>>> fig = plt.figure() 
>>> ax = fig.add_subplot(111) 
>>> ax.plot((1, 3, 1)) 
[<matplotlib.lines.Line2D object at 0x0290B750>] 
>>> plt.show() 

và như mong đợi tôi nhận được bảng xếp hạng một trong mong đợi, trong một cửa sổ mới mà đã xuất hiện bất ngờ, chứa một dòng màu xanh rất đơn giản đi từ 1 đến 3 trở lại 1 trên trục y, với 0, 1, 2 là các điểm trục x (giống như ví dụ). Bây giờ tôi đóng cửa sổ đồ thị (sử dụng nút chéo ở trên cùng bên phải dưới cửa sổ). Điều này cho phép tôi kiểm soát để người phiên dịch, và tôi bắt đầu một lần nữa, tạo ra các đối tượng mới:

>>> 
>>> fig1 = plt.figure() 
>>> bx = fig1.add_subplot(111) 
>>> bx.plot((1, 3, 1)) 
[<matplotlib.lines.Line2D object at 0x029E8210>] 
>>> plt.show() 

thời gian này mặc dù, tôi nhận được một khung cửa sổ, không có gì trong đó (chỉ là khung, không có nền trắng không có gì), và toàn bộ vụ nổ súng bị treo. Tôi phải "kết thúc nhiệm vụ", trình thông dịch python được chấm dứt bởi hệ thống và tôi nhận được một dấu nhắc lệnh trở lại. Hành vi tương tự trên một mac (ngoại trừ nó thực sự âm mưu đồ thị đầu tiên, trước khi cũng treo).

Vì vậy, bằng cách nào đó Python và/hoặc matplotlib không muốn tôi đóng cửa sổ theo cách thủ công. Có ai biết chuyện gì đang xảy ra và tôi nên làm gì không? Những gì tôi muốn làm là chơi xung quanh với các lô khác nhau từ bên trong thông dịch viên, và rõ ràng hành vi này không giúp ích gì. Tôi biết tôi có thể sử dụng "Ipython -pylab" nhưng vì lợi ích của việc học, tôi muốn hiểu lỗi trên.

Cảm ơn. bạn

Trả lời

2

Rõ ràng, điều này là do lỗi trong chương trình phụ trợ tkinter. Xem, ví dụ: https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834. Nó đang được làm việc trên ... Nếu bạn có thể quay trở lại thư viện tkinter cũ hơn một chút, đó sẽ là một giải pháp cho thời gian (tôi đã chạy vào điều tương tự này vài tuần trước, và đó là hy vọng duy nhất của tôi).

0

đã thử:

plt.close() 

để chắc chắn rằng bạn đã đóng các đối tượng âm mưu?

+0

tôi có bây giờ Casey, nhưng không có sự thay đổi. Khi tôi gọi plt.show(), nó cho thấy cửa sổ đồ thị của trình thông dịch Python không còn sử dụng, nghĩa là tôi không có lời nhắc. Chỉ khi tôi đóng cửa sổ, tôi mới nhận được lời nhắc. Nếu sau đó tôi gọi plt.close() và sau đó tiếp tục, nó hoạt động theo cùng một cách, tức là treo cứng. Bắt cảm giác (đào xung quanh trang web Matplotlib) rằng về cơ bản họ muốn bạn dính vào iPython ở chế độ -pylab. –

+0

thử tải xuống scipy, nếu bạn chưa có và nhập pylab. nó hoạt động giống như matplotlib. – Nope

+0

Không - không có gì. Nếu nhập khẩu pylab, và làm tất cả các bên trên, cư xử trong chính xác theo cùng một cách. –

2

Bạn đã thử sử dụng ipython thay vì trình thông dịch chuẩn python?

Bạn có thể cài đặt ipython với lệnh sau đây:

easy_install ipython 

và sau đó, ipython có một chế độ cụ thể được chạy với pylab, gọi -pylab:

ipython -pylab 

In[1]: ... 

Tôi nghĩ rằng hầu hết các những người sử dụng giải pháp này để vẽ đồ thị với python, nó là một dòng lệnh tương tự như một trong R/Matlab, hoàn thành, vv ... và nó chạy một thread tách biệt cho mỗi cốt truyện vì vậy nó không nên có vấn đề bạn có mô tả.

+0

Cảm ơn - vâng tôi biết tuyến đường Ipython (xem chú thích ở trên). Quả thực nó trông như thế này là con đường để đi, mặc dù nó cũng có thể là một chút không thể đoán trước. Tôi nghĩ rằng bạn là đúng mặc dù. Basicall Ipython là con đường phía trước. –

8

Ba tháng trễ cho bữa tiệc, nhưng tôi đã tìm thấy đề xuất trong tài liệu MATLAB để sử dụng lệnh vẽ() thay vì hiển thị(); các cựu dường như chỉ làm một render của cốt truyện hiện tại, trong khi sau này bắt đầu lên tất cả các công cụ tương tác, đó là nơi mà các vấn đề dường như bắt đầu.

Nó không khủng khiếp nổi bật đặt trong tài liệu, nhưng đây là liên kết: pylab.show http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

Đối với những gì nó có giá trị, tôi đã cố gắng() và có chính xác cùng một vấn đề bạn đã làm, trong khi pylab. vẽ() dường như làm việc tốt nếu tôi chỉ muốn xem đầu ra.

+0

Cảm ơn Rich - hữu ích. Ba tháng không phải là quá muộn vì bây giờ tôi chỉ trở lại matplotlib sau một thời gian gián đoạn. –

+0

Cảm ơn bạn đã liên kết. Tôi đã luôn luôn nhầm lẫn về show() và vẽ() và cuối cùng tôi tìm thấy một số thông tin tốt về nó. – Viktiglemma

+0

Đó là năm 2014 với Matplotlib 1.4 và câu trả lời này vẫn có liên quan. – SkyNT

0

Được đăng ở đâu đó ở trên:

Sử dụng plt.draw() cho tất cả các ô của bạn ngoại trừ ô cuối cùng.

Đối với cốt truyện cuối cùng của bạn, sử dụng plt.show()

Đó là lạ, nhưng nếu bạn không sử dụng plt.show() trong tác phẩm mới nhất và thử plt.draw() thay vào đó, bạn không nhìn thấy bất kỳ âm mưu.

Chúc may mắn với điều này!

0

Tôi gặp sự cố này khi sử dụng TkAgg làm chương trình phụ trợ. Sau khi sử dụng plt.close('all') máy tính của tôi bị đóng băng.

Giải pháp là chuyển sang một chương trình phụ trợ khác. Bây giờ tôi sử dụng Qt4Agg để thay thế.

Nếu bạn có Qt4Agg installed nó có thể chuyển đổi backends bằng cách gõ:

plt.switch_backend('Qt4Agg') 

trước âm mưu dữ liệu

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