Gọi pylab.savefig mà không hiển thị trong ipython


111

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

Không chắc đây là câu hỏi matplotlibhay IPythonsổ tay.


Câu trả lời của @staticfloat phù hợp với tôi ngay cả khi không ở trong sổ ghi chép và khi sử dụng matplotlib thông qua JuliaLang; sử dụngioff
Vass

Câu trả lời:


173

Đây là một 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 phần 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')

CHỈNH SỬA: Nếu bạn không muốn mất khả năng hiển thị các ô, hãy tắt Chế độ tương tác và chỉ gọi plt.show()khi bạn đã sẵn sàng hiển thị các ô:

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
Được - nhưng, tôi muốn giữ lại âm mưu nội tuyến 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 toàn trên 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 việc vẽ nội tuyến với trường hợp ngoại lệ là 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 nào về cách tạm thời thay đổi chương trình phụ trợ trong 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 close()show()lệnh và , sẽ giải quyết vấn đề của bạn. không hỗ trợ thay đổi phụ trợ nhanh chóng, như bạn đã phát hiện ra.
staticfloat

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

1
Công thức tôi đã đưa ra là một công thức chung; nếu bạn không làm việc trong sổ ghi chép ipython, hàm plt.ioff () rất quan trọng để ngăn các số liệu nhấp nháy trên và ngoài màn hình, vì trong dòng lệnh, các số liệu ipython được vẽ ngay khi bạn gọi plt.plot()nếu chế độ tương tác được bật. Tắt chế độ tương tác sẽ trì hoãn việc hiển thị bất kỳ ô nào cho đến khi plt.show(). Vì bạn đang sử dụng sổ ghi chép ipython nên chế độ tương tác được xử lý theo cách khác.
staticfloat

Đối với tôi, matplotlib.use('Agg')một mình tôi đã làm được thủ thuật. Tôi không cần bất kỳ plt.show()hoặc plt.ioff()trong mã của mình.
Zhanwen Chen

67

Chúng tôi không cần 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ử cái này:

%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 đoạn 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)vào phần cuối của nó, bạn sẽ không thấy gì cả.

Tóm lại, nếu bạn đóng con số này plt.close(fig), nó sẽ không được hiển thị.


5
Giải pháp tốt hơn thực sự! Tôi tạo và lưu nhiều âm mưu trong một vòng lặp. Với plt.iofftôi nhận được RuntimeWarning: More than 20 figures have been opened.... plt.closeđã giải quyết nó.
Nagasaki45
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.