matplotlib에서 플롯을 지우는 데 cla (), clf () 또는 close ()를 사용하는 경우는 언제입니까?


540

Matplotlib는 다음과 같은 기능을 제공합니다.

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

설명서에는 이러한 기능의 차이점이 무엇인지에 대한 많은 통찰력이 없습니다. 각 기능은 언제 사용해야하며 정확히 어떻게해야합니까?

답변:


713

matplotlib은 그림 창에 많은 축으로 구성된 그림이 포함 된 계층 적 순서를 사용하므로 모두 서로 다른 작업을 수행합니다. 또한 pyplot 인터페이스의 함수가 있으며 Figure클래스에 메소드가 있습니다 . 아래 두 경우 모두에 대해 설명하겠습니다.

pyplot 인터페이스

pyplotmatplotlib을 기능적으로 사용할 수 있도록 몇 가지 기능을 수집하는 모듈입니다. 여기서는 pyplot로 가져온 것으로 가정합니다 import matplotlib.pyplot as plt. 이 경우 물건을 제거하는 세 가지 명령이 있습니다.

plt.cla()axes , 즉 현재 그림에서 현재 활성화 된 축을 지 웁니다 . 다른 축은 그대로 둡니다.

plt.clf()모든 축으로 현재 그림 전체를 지우지 만 창을 열어두고 다른 플롯에 재사용 할 수 있습니다.

plt.close()달리 지정하지 않으면 현재 창이 될 window를 닫습니다 .

가장 적합한 기능은 사용 사례에 따라 다릅니다.

또한이 close()기능을 통해 어떤 창을 닫아야하는지 지정할 수 있습니다. 인수는 창을 사용하여 만들 때 창에 주어진 숫자 또는 이름 figure(number_or_name)이거나를 사용하여 fig얻은 그림 인스턴스 일 수 있습니다 fig = figure(). 에 인수가 없으면 close()현재 활성화 된 창이 닫힙니다. 또한 close('all')모든 그림을 닫는 구문이 있습니다.

Figure 클래스의 메소드

또한이 Figure클래스는 그림을 지우는 방법을 제공합니다. 나는 다음과 같이 가정 fig합니다 Figure:

fig.clf()전체 그림을 지 웁니다 . 이 호출은 현재 수치 인 plt.clf()경우에만 해당됩니다 fig.

fig.clear() 의 동의어입니다 fig.clf()

del fig연관된 그림 창을 닫지 않아도 됩니다. 내가 아는 한 그림 창을 닫는 유일한 방법 plt.close(fig)은 위에서 설명한대로 사용 하는 것입니다.


38
close()특정 명령이 아니기 때문에 그림 닫기를 지정하는 방법을 찾았습니다 ( fig.close()함수가 아님). 올바른 구문은 다음과 같습니다 plt.close(fig).
tyleha

무엇에 대해 clear(), 내가 가진 많은 차이 보지 cla()기생충 축 만 만 cla()특별하게 취급됩니다.
dashesy

1
clear()내 기능 이 없습니다 matplotlib.pyplot(MacOS 버전 1.4.2). 관련 문서로 안내해 주시겠습니까?
David Zwicker

2
Figure 클래스와 Axes 클래스에는 모두 clear()메소드가 있습니다. 에 Figure.clear해당하는 clfAxes.clear에 해당합니다 cla.
SiggyF

2
이것은 jupyter와 관련하여 작동합니까? jupyter에서 셀을 다시 실행할 때 그림이 가비지 수집되지 않기 때문에 메모리 오류가 계속 발생합니다.
CMCDragonkai

79

오늘 내가 발견 한 경고가 있습니다. 플롯을 여러 번 호출하는 함수가있는 경우 어떻게 든 첫 번째 메모리 plt.close(fig)대신 fig.clf()메모리에 누적되지 않는 것이 좋습니다 . 간단히 말해서 메모리가 중요한 경우 plt.close (fig)를 사용하십시오 ( 더 나은 방법이있는 것 같지만 관련 링크는이 주석의 끝으로 이동하십시오).

따라서 다음 스크립트는 빈 목록을 생성합니다.

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

이것에 5 개의 숫자가있는리스트가 생성됩니다.

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

위의 문서에서 그림을 닫는 것과 창을 닫는 것의 차이점은 무엇인지 명확하지 않습니다. 어쩌면 그것은 분명해질 것입니다.

완전한 스크립트를 사용하려면 다음이 있습니다.

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())

누군가가 이미 해결 방법을 게시 한 메모리 문제가 우려 되는 경우 참조 카운트가 계산 된 그림 만들기


26
참조 계산 질문에 대한 유용한 상호 참조에 감사드립니다. 이것이 Matplotlib 이미 작동하는 방식입니다. 표준 pyplotAPI 에서 수치가 가비지 수집되지 않는다는 것은 끔찍한 일입니다 .
Cecil Curry

1
그럼에도 불구하고 애니메이션을 만들어야하는 경우 (예 : 일부 2D 등고선 / pcolormesh 맵) 오래된 것을 닫고 새 그림 패널을 만드는 대신 그림을 지우고 새 필드를 그리는 것이 좋습니다. 속도는 완전히 다릅니다.
msi_gerva

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.