2013-03-30 25 views
50

Tôi cần tạo một hình trong một tệp mà không hiển thị nó trong sổ ghi chép IPython. Tôi không rõ ràng về sự tương tác giữa IPythonmatplotlib.pylab về vấn đề này. Nhưng, khi tôi gọi pylab.savefig("test.png"), hình hiện tại được hiển thị ngoài việc được lưu trong test.png. Khi tự động tạo một tập hợp lớn các tệp lô, điều này thường không mong muốn. Hoặc trong trường hợp một tập tin trung gian để xử lý bên ngoài bởi một ứng dụng khác là mong muốn.Gọi pylab.savefig mà không hiển thị trong ipython

Không chắc chắn nếu đây là câu hỏi trên máy tính xách tay matplotlib hoặc IPython.

Trả lời

79

Đây là câu hỏi matplotlib và bạn có thể giải quyết vấn đề này bằng cách sử dụng chương trình phụ trợ không hiển thị cho người dùng, ví dụ: 'AGG':

import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as plt 

plt.plot([1,2,3]) 
plt.savefig('/tmp/test.png') 

EDIT: Nếu bạn không muốn mất khả năng hiển thị âm mưu, tắt Interactive Mode, và chỉ gọi plt.show() khi bạn đã sẵn sàng để hiển thị các lô:

import matplotlib.pyplot as plt 

# Turn interactive plotting off 
plt.ioff() 

# Create a new figure, plot into it, then close it so it never gets displayed 
fig = plt.figure() 
plt.plot([1,2,3]) 
plt.savefig('/tmp/test0.png') 
plt.close(fig) 

# Create a new figure, plot into it, then don't close it so it does get displayed 
plt.figure() 
plt.plot([1,3,2]) 
plt.savefig('/tmp/test1.png') 

# Display all "open" (non-closed) figures 
plt.show() 
+2

Ok - nhưng, tôi muốn giữ lại nội tuyến âm mưu trong iPython. Những gì bạn đề xuất hoạt động tốt nếu thực hiện chuyển đổi hoàn chỉnh trên chương trình phụ trợ. Câu hỏi đặt ra là làm thế nào để bạn cho phép tình hình chung của nội tuyến âm mưu với trường hợp đặc biệt của tiết kiệm số liệu (không hiển thị nội tuyến). Với đề xuất của bạn, tôi đã cố gắng tải lại các mô-đun và thay đổi chương trình phụ trợ tạm thời nhưng không thành công. Bất kỳ ý tưởng về cách tạm thời thay đổi các phụ trợ trong một phiên máy tính xách tay iPython? – tnt

+1

Tôi đã cập nhật câu hỏi để nói về âm mưu tương tác và các lệnh 'close()' và 'show()' sẽ giải quyết vấn đề của bạn. việc thay đổi các chương trình phụ trợ khi đang chạy không được hỗ trợ, như bạn đã khám phá. – staticfloat

+3

Cảm ơn bạn đã phản hồi rất tốt. Có vẻ như plt.close (fig) là lệnh quan trọng cho nhu cầu của tôi. Tôi vẫn chưa rõ ràng về ioff vì nó dường như không ảnh hưởng đến hoạt động; nhưng, có lẽ tôi đang thiếu cái gì đó. Cảm ơn một lần nữa. – tnt

25

Chúng tôi không cần phải plt.ioff() hoặc plt.show() (nếu chúng tôi sử dụng %matplotlib inline). Bạn có thể kiểm tra mã trên mà không cần plt.ioff(). plt.close() có vai trò thiết yếu. Hãy thử điều này một:

%matplotlib inline 
import pylab as plt 

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes. 
## plt.ioff() 

# Create a new figure, plot into it, then close it so it never gets displayed 
fig = plt.figure() 
plt.plot([1,2,3]) 
plt.savefig('test0.png') 
plt.close(fig) 

# Create a new figure, plot into it, then don't close it so it does get displayed 
fig2 = plt.figure() 
plt.plot([1,3,2]) 
plt.savefig('test1.png') 

Nếu bạn chạy mã này trong ipython, nó sẽ hiển thị một âm mưu thứ hai, và nếu bạn thêm plt.close(fig2) đến phần cuối của nó, bạn sẽ thấy không có gì.

Tóm lại, nếu bạn đóng nhân vật bởi plt.close(fig), nó sẽ không được hiển thị.

+0

giải pháp tốt hơn! – PlagTag

+0

Giải pháp tốt hơn thực sự! Tôi tạo và lưu nhiều ô trong một vòng lặp. Với 'plt.ioff' tôi nhận' RuntimeWarning: Hơn 20 hình đã được mở ... '. 'plt.close' đã giải quyết nó. – Nagasaki45

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