Khi nào nên sử dụng ngột ngạt (), clf () hoặc close () để xóa một âm mưu trong matplotlib?


542

Matplotlib cung cấp các chức năng:

cla()   # Clear axis
clf()   # Clear figure
close() # Close a figure window

Tài liệu này không cung cấp nhiều thông tin chuyên sâu về sự khác biệt giữa các chức năng này. Khi nào tôi nên sử dụng từng chức năng và chính xác nó làm gì?

Câu trả lời:


714

Tất cả đều làm những việc khác nhau, vì matplotlib sử dụng một thứ tự phân cấp trong đó một cửa sổ hình chứa một hình có thể bao gồm nhiều trục. Ngoài ra, có các chức năng từ giao diện pyplot và có các phương thức trên Figurelớp. Tôi sẽ thảo luận về cả hai trường hợp dưới đây.

giao diện pyplot

pyplotlà một mô-đun thu thập một vài chức năng cho phép matplotlib được sử dụng theo cách thức chức năng. Tôi ở đây cho rằng pyplotđã được nhập khẩu như import matplotlib.pyplot as plt. Trong trường hợp này, có ba lệnh khác nhau loại bỏ công cụ:

plt.cla()xóa một trục , tức là các trục hiện đang hoạt động trong hình hiện tại. Nó để lại các trục khác không bị ảnh hưởng.

plt.clf()xóa toàn bộ hình hiện tại bằng tất cả các trục của nó, nhưng để cửa sổ mở, để nó có thể được sử dụng lại cho các ô khác.

plt.close()đóng một cửa sổ , sẽ là cửa sổ hiện tại, nếu không được chỉ định khác.

Do đó, chức năng nào phù hợp với bạn nhất phụ thuộc vào trường hợp sử dụng của bạn.

Các close()chức năng hơn nữa cho phép một để xác định các cửa sổ nên được đóng lại. Đối số có thể là một số hoặc tên được đặt cho một cửa sổ khi nó được tạo bằng cách sử dụng figure(number_or_name)hoặc nó có thể là một thể hiện hình figthu được, tức là sử dụng fig = figure(). Nếu không có đối số nào được đưa ra close(), cửa sổ hiện đang hoạt động sẽ bị đóng. Hơn nữa, có cú pháp close('all'), đóng tất cả các số liệu.

các phương thức của lớp Hình

Ngoài ra, Figurelớp cung cấp các phương thức để xóa số liệu. Tôi sẽ giả sử sau đây figlà một ví dụ của Figure:

fig.clf()xóa toàn bộ con số . Cuộc gọi này chỉ tương đương plt.clf()nếu figlà con số hiện tại.

fig.clear() là một từ đồng nghĩa với fig.clf()

Lưu ý rằng thậm chí del figsẽ không đóng cửa sổ hình liên quan. Theo như tôi biết thì cách duy nhất để đóng cửa sổ hình là sử dụng plt.close(fig)như mô tả ở trên.


38
close()là một lệnh không cụ thể, tôi đã tìm cách chỉ định đóng hình ( fig.close()không phải là hàm). Cú pháp đúng là : plt.close(fig).
tyleha

những gì về clear(), tôi đã không thấy nhiều sự khác biệt với cla()chỉ trong trục ký sinh trùng chỉ cla()được điều trị đặc biệt.
bảnh bao

1
Không có clear()chức năng nào trong matplotlib.pyplot(Phiên bản 1.4.2 trên MacOS) của tôi. Bạn có thể hướng tôi đến các tài liệu liên quan?
David Zwicker

2
Cả lớp Hình và lớp Axes đều có một clear()phương thức. Các Figure.cleartương đương clfAxes.cleartương đương với cla.
SiggyF

2
Điều này có liên quan đến jupyter? Tôi tiếp tục gặp lỗi bộ nhớ vì các số liệu không phải là rác được thu thập khi tôi chạy lại một ô trong jupyter.
CMCDragonkai

79

Chỉ có một cảnh báo mà tôi phát hiện ra ngày hôm nay. Nếu bạn có một chức năng đang gọi một cốt truyện rất nhiều lần bạn nên sử dụng tốt hơn plt.close(fig)thay vì fig.clf()bằng cách nào đó, cái đầu tiên không tích lũy trong bộ nhớ. Tóm lại, nếu bộ nhớ là mối quan tâm, hãy sử dụng plt.close (fig) (Mặc dù có vẻ như có nhiều cách tốt hơn, hãy đi đến cuối nhận xét này cho các liên kết có liên quan).

Vì vậy, đoạn script sau sẽ tạo ra một danh sách trống:

for i in range(5):
    fig = plot_figure()
    plt.close(fig)
# This returns a list with all figure numbers available
print(plt.get_fignums())

Trong khi đó, cái này sẽ tạo ra một danh sách với năm con số trên đó.

for i in range(5):
    fig = plot_figure()
    fig.clf()
# This returns a list with all figure numbers available
print(plt.get_fignums())

Từ tài liệu trên không rõ ràng cho tôi sự khác biệt giữa đóng hình và đóng cửa sổ. Có lẽ điều đó sẽ làm rõ.

Nếu bạn muốn thử một kịch bản hoàn chỉnh, bạn có:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1000)
y = np.sin(x)

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    plt.close(fig)

print(plt.get_fignums())

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    fig.clf()

print(plt.get_fignums())

Nếu bộ nhớ là mối quan tâm ai đó đã đăng một công việc trong SO hãy xem: Tạo một số liệu được tính tham chiếu


26
Cảm ơn đã tham khảo chéo hữu ích cho câu hỏi đếm tham khảo. Đó chính xác là cách Matplotlib nên hoạt động. Điều đáng sợ và kinh khủng không kém là các số liệu không bao giờ là rác được thu thập theo pyplotAPI tiêu chuẩn .
Cecil Curry

1
Tuy nhiên, tôi đã thấy rằng nếu người ta phải tạo hình động (ví dụ như một số bản đồ đường viền 2D / pcolormesh) thì tốt hơn là xóa hình và vẽ các trường mới thay vì đóng các bảng hình cũ. Tốc độ sẽ hoàn toàn khác nhau.
msi_gerva

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.