Matplotlib에서는 한 번 close()로 닫아버린 그림(figure)도 새로운 캔버스 매니저(Canvas Manager)를 생성하고, 기존 그림을 새 캔버스의 figure에 할당하면 다시 화면에 표시할 수 있습니다. 이 글에서는 그 과정을 단계별로 살펴보겠습니다.
구현 단계
- 그림 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
- 새 그림을 만들거나 기존 그림을 활성화합니다.
- NumPy를 사용해 x, y 데이터 포인트를 생성합니다.
- plot() 메서드로 x, y 데이터를 그래프에 그립니다.
- 그래프가 그려진 현재 그림을 close()로 닫습니다.
- 이전 그림(fig)을 새로운 캔버스 figure에 저장합니다.
- 해당 그림을 포함하는 캔버스를 설정합니다.
- show() 메서드를 호출해 그림을 화면에 표시합니다.
예제 코드
import numpy as np from matplotlib import pyplot as plt plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True fig = plt.figure() x = np.linspace(-10, 10, 100) y = np.sin(x) plt.plot(x, y) plt.close(fig) new_fig = plt.figure() new_manager = new_fig.canvas.manager new_manager.canvas.figure = fig fig.set_canvas(new_manager.canvas) plt.show()
코드 설명
위 코드의 핵심 동작은 다음과 같습니다.
- plt.close(fig): 그려진 그림 객체 자체는 메모리에 남아 있지만, 화면에는 더 이상 표시되지 않도록 창을 닫습니다.
- new_manager = new_fig.canvas.manager: 새로 만든 그림의 캔버스 매니저를 가져옵니다.
- new_manager.canvas.figure = fig: 새 캔버스가 참조하는 figure를 이전에 닫았던 fig로 교체합니다.
- fig.set_canvas(new_manager.canvas): 원래 그림(fig)에 새 캔버스를 연결하여 렌더링이 가능하도록 만듭니다.
실행 결과
코드를 실행하면 먼저 sin 곡선이 그려진 후 그림이 닫히고, 이어서 새 캔버스에 동일한 그림이 다시 나타나 화면에 표시됩니다.


마무리
이처럼 Matplotlib에서 닫힌 그림은 완전히 소멸하는 것이 아니라, 캔버스 매니저를 활용하면 언제든 다시 불러와 표시할 수 있습니다. 대화형 환경이나 GUI 애플리케이션에서 실수로 그림을 닫았을 때 유용하게 활용할 수 있는 기법입니다.