P2-13.3 여러 그래프를 비교하고 저장하기¶
Section ID:
P2-13.3Version:v2026.07.23
P2-13.2에서는 선 그래프(line plot), 산점도(scatter plot), 히스토그램(histogram)처럼 기본 차트를 어떤 질문에 쓰는지 봤습니다. 이제 한 걸음 더 나아가 여러 그래프를 함께 보고, 그 결과를 파일로 남기는 흐름을 정리합니다.
AI 학습에서는 그래프 하나만 보고 끝나는 일이 많지 않습니다. 손실(loss)과 정확도(accuracy)를 함께 보거나, 학습 데이터(train data)와 검증 데이터(validation data)의 흐름을 나란히 비교해야 합니다. 이때 Matplotlib의 Figure와 Axes 구조를 조금 더 의식하면 좋습니다.
여기서는 savefig, 범례(legend), 정확도(accuracy)를 포함한 비교·저장 흐름의 기본 구분을 설명합니다. 그래프(plot), Figure, Axes의 대표 설명은 P2-13.1에, 기본 차트 선택 기준은 P2-13.2와 개념사전에 두고, 여기서는 여러 그래프를 함께 비교하고 결과를 파일로 남기는 방법을 설명합니다.
핵심 기준: 여러 그래프를 비교하고 저장하기¶
- 하나의
Figure안에 여러Axes를 둘 수 있음을 설명할 수 있습니다. - 손실(loss)과 정확도(accuracy)를 나란히 비교하는 그래프를 만들 수 있습니다.
- 학습 손실(train loss)과 검증 손실(validation loss)을 한 축에서 비교할 수 있습니다.
- 그래프를
savefig()로 저장해 문서나 학습 기록에 다시 사용할 수 있습니다. - 저장된 그래프가 재현 가능한 기록이 되려면 코드와 데이터 조건도 함께 필요함을 설명할 수 있습니다.
세 가지 기준¶
| 기준 | 왜 중요한가 | 이 절에서 필요한 이해 수준 |
|---|---|---|
| 여러 그래프를 왜 같이 그리나 | 그래프 수가 아니라 비교 질문이 핵심임을 분명하게 해 줍니다. | 비교 질문을 더 분명하게 만들기 위해서라고 이해합니다. |
| 같은 축과 다른 축은 언제 나누나 | 비교 가능한 값과 분리해야 할 값을 구분하게 해 줍니다. | 직접 비교가 중요하면 같이, 해석이 섞이면 나눈다고 이해합니다. |
| 저장은 왜 중요한가 | 화면 출력과 재사용 가능한 기록을 구분하게 해 줍니다. | 결과뿐 아니라 나중에 다시 설명할 기록을 남기기 때문이라고 이해합니다. |
| 용어 | 이 절에서 먼저 잡을 뜻 |
|---|---|
savefig | 현재 그래프를 이미지 파일로 저장하는 함수 호출입니다. |
| 범례(legend) | 여러 선이나 점이 각각 무엇을 뜻하는지 구분해 주는 표식입니다. |
| 정확도(accuracy) | 전체 예측 중 맞춘 비율을 나타내는 기본 성능 지표입니다. |
| 비교 그래프(comparison plot) | 둘 이상의 흐름이나 값을 나란히 비교하려고 만든 그래프입니다. |
| 재현 가능한 기록(reproducible record) | 같은 코드와 조건으로 다시 만들 수 있게 남겨진 그래프 결과입니다. |
여러 그래프는 비교 질문을 만든다¶
그래프를 여러 개 배치하는 이유는 화면을 채우기 위해서가 아닙니다. 서로 관련된 질문을 나란히 놓기 위해서입니다.
예를 들어 학습 과정에서 손실(loss)은 줄어들고, 정확도(accuracy)는 올라가는지 보고 싶을 수 있습니다. 두 값은 단위가 다르므로 같은 y축에 억지로 올리기보다, 두 개의 작은 그래프로 나누어 보는 편이 읽기 쉽습니다.
문제 상황: 학습이 진행될수록 손실과 정확도가 각각 어떻게 바뀌는지 한 화면에서 비교하고 싶습니다. 입력(input): 에폭(epoch) 번호, 손실 값 목록, 정확도 값 목록. 기대 출력(output): 왼쪽에는 손실 곡선, 오른쪽에는 정확도 곡선이 놓인 1행 2열 그래프. 확인할 개념: 하나의 Figure 안에 여러 Axes를 두면 관련된 질문을 나란히 비교할 수 있습니다.
출력 결과는 다음처럼 관련된 두 질문을 한 Figure 안에서 나누어 보여 줍니다.
이 그림은 두 가지를 동시에 묻습니다.
- 손실은 반복 학습이 진행될수록 대체로 줄어드는가?
- 정확도는 같은 기간에 대체로 올라가는가?
두 그래프를 나란히 놓으면 “하나는 좋아지는데 다른 하나는 정체되는가?” 같은 질문도 만들 수 있습니다.
이 비교 방식은 학습 곡선에만 쓰이는 것이 아닙니다. 예를 들어 한쪽 Axes에는 두 동작 기록의 원시 곡선을 그리고, 다른 쪽 Axes에는 그 동작들을 구간 평균이나 마지막 값으로 요약한 작은 비교 그래프를 둘 수도 있습니다. 이렇게 하면 왼쪽에서는 모양 자체의 차이를 보고, 오른쪽에서는 요약값으로 남는 차이를 함께 볼 수 있습니다.
즉, 여러 그래프를 함께 둔다는 것은 그림 수를 늘리는 일이 아니라, 원본 모양과 요약 결과를 어떤 질문으로 같이 읽을 것인가를 더 분명하게 만드는 일입니다.
Figure와 Axes를 다시 읽기¶
P2-13.1에서는 Figure를 그림 전체, Axes를 데이터가 그려지는 좌표 영역으로 봤습니다. 여러 그래프를 그릴 때 이 구분이 더 중요해집니다.
문제 상황: 여러 칸으로 나뉜 그래프를 만들 때 fig와 axes가 각각 무엇을 가리키는지 먼저 잡아야 합니다. 입력(input): plt.subplots(1, 2) 호출 한 줄. 기대 출력(output): 전체 그림 하나와 그 안의 그래프 칸 두 개를 가리키는 변수 구조. 확인할 개념: Figure는 전체 그림이고 Axes는 실제 데이터를 그리는 개별 좌표 영역입니다.
이 코드는 하나의 Figure 안에 좌우로 두 개의 Axes를 만듭니다.
여기서는 다음처럼 읽습니다.
| 코드 | 직관 |
|---|---|
fig | 전체 그림 |
axes[0] | 왼쪽 그래프 칸 |
axes[1] | 오른쪽 그래프 칸 |
plt.subplots(1, 2) | 1행 2열로 그래프 칸을 만든다 |
즉, Axes가 여러 개가 되면 ax.plot(...) 하나만 쓰는 방식에서 axes[0].plot(...), axes[1].plot(...)처럼 “어느 칸에 그릴지”를 지정하는 방식으로 바뀝니다.
같은 축에서 비교해야 할 때도 있다¶
항상 그래프를 나누는 것이 좋은 것은 아닙니다. 같은 단위의 값을 비교할 때는 같은 Axes 위에 두 선을 올리는 편이 더 직접적입니다.
대표적인 예가 학습 손실(train loss)과 검증 손실(validation loss)의 비교입니다. 두 값은 모두 손실(loss)이므로 같은 y축에서 비교할 수 있습니다.
문제 상황: 학습 손실과 검증 손실이 같은 단위이므로 한 축에서 직접 비교하고 싶습니다. 입력(input): 에폭 번호, train_loss, validation_loss 목록. 기대 출력(output): 같은 좌표축 위에 두 손실 곡선이 함께 그려진 선 그래프. 확인할 개념: 같은 단위의 값은 같은 Axes에 올려야 두 흐름의 벌어짐과 교차를 바로 읽기 쉽습니다.
출력 결과는 다음처럼 두 손실 곡선을 한 축에서 비교하게 해 줍니다.
이 예시는 Part 3에서 다시 만날 과적합(overfitting)의 직관과 연결됩니다. 학습 손실은 계속 내려가는데 검증 손실이 다시 올라간다면, 모델이 학습 데이터에는 더 잘 맞지만 새로운 데이터에는 덜 맞을 가능성을 의심할 수 있습니다.
다만 여기서 결론을 단정하지는 않습니다. 이 그래프는 “과적합이 확정되었다”가 아니라 “검증 데이터에서 성능 흐름을 더 확인해야 한다”는 질문을 만듭니다.
그래프를 저장한다는 것은 기록을 남기는 일이다¶
Colab이나 Jupyter Notebook에서는 plt.show()로 그래프를 바로 볼 수 있습니다. 하지만 책, 보고서, 실험 기록에 넣으려면 이미지 파일로 저장해야 합니다.
Matplotlib에서는 savefig()를 사용합니다.
문제 상황: 화면에서 본 그래프를 문서와 기록에 다시 쓰기 위해 파일로 남겨야 합니다. 입력(input): 이미 만들어 둔 fig 객체와 저장할 파일 이름. 기대 출력(output): 현재 그래프가 PNG 같은 이미지 파일로 저장됩니다. 확인할 개념: plt.show()는 화면 표시이고 savefig()는 재사용 가능한 결과 파일 저장입니다.
여기서는 다음처럼 이해합니다.
| 코드 | 의미 |
|---|---|
plt.show() | 현재 실행 화면에서 그래프를 본다 |
fig.savefig(...) | 그래프를 이미지 파일로 저장한다 |
fig.tight_layout() | 제목, 축 라벨, 그래프 영역이 겹치지 않게 여백을 조정한다 |
문서 프로젝트에서는 이런 방식으로 출력 이미지를 자주 생성합니다. 코드를 실행해 이미지를 만들고, 그 이미지를 Markdown 문서에 링크합니다.
저장된 이미지만으로는 재현성이 부족하다¶
그래프 파일은 결과를 보여 주지만, 그 자체만으로는 재현 가능한 기록이 아닙니다. 같은 그래프를 다시 만들려면 다음 정보가 필요합니다.
- 그래프를 만든 코드
- 사용한 데이터 또는 데이터 생성 조건
- 사용한 라이브러리와 버전
- 랜덤 값이 들어간 경우 난수 시드(random seed)
- 그래프가 답하려는 질문
그래서 문서 프로젝트에서는 이미지 파일만 만들지 않고, 가능하면 이미지를 생성한 Python 스크립트도 함께 둡니다. 예를 들어 한 장의 그래프를 여러 번 수정해야 한다면, 이미지와 가까운 위치에 생성 스크립트를 두는 편이 결과를 다시 만들기 쉽습니다.
이 절의 두 예시 이미지는 p2_13_3_compare_and_save.py로 다시 만들 수 있습니다. 이 파일은 MPLCONFIGDIR를 프로젝트의 .tmp 아래로 고정하고, fig.savefig(...)로 산출 이미지를 같은 자산 폴더에 저장합니다.
이 방식은 “그림을 붙였다”보다 “그림을 다시 만들 수 있다”에 가깝습니다.
비교 그래프를 만들 때의 주의점¶
여러 그래프를 비교할 때는 다음을 조심합니다.
| 주의점 | 이유 |
|---|---|
| 서로 다른 단위를 같은 축에 억지로 올리지 않는다 | 변화가 왜곡되어 보일 수 있다 |
| 같은 단위의 값은 같은 축에서 비교할 수 있다 | train loss와 validation loss처럼 직접 비교가 가능하다 |
| 범례(legend)를 붙인다 | 선이 무엇을 뜻하는지 알 수 있어야 한다 |
| 축 범위를 확인한다 | 작은 차이가 과장되거나 큰 차이가 숨겨질 수 있다 |
| 저장 파일 이름을 설명적으로 짓는다 | 나중에 어떤 그래프인지 다시 알 수 있어야 한다 |
그래프는 결론을 대신하지 않습니다. 하지만 좋은 그래프는 다음 질문을 더 정확하게 만들게 도와줍니다.
사례 및 예시¶
사례 1. 손실과 정확도를 한 장의 그림으로 남겨야 할 때¶
한 학습자가 모델 학습 결과를 정리해 팀 문서에 넣으려 한다고 하겠습니다. 손실 그래프 하나만 보면 학습이 안정적인지 볼 수 있지만, 정확도와 함께 보면 손실은 줄지만 정확도는 정체되는가 같은 비교 질문을 더 분명히 할 수 있습니다.
사람이 먼저 쓰는 기준은 그래프 하나면 충분하지 않을까일 수 있습니다. 하지만 실제 실험 기록에서는 서로 관련된 값들을 나란히 두거나, 같은 단위의 값은 한 축에서 함께 비교해야 해석이 쉬워집니다. 그래서 여러 Axes를 두는 구조와 범례, 축 라벨이 중요해집니다.
또 화면에서 한 번 보고 끝내면 나중에 다시 설명하기 어렵습니다. 그래프를 savefig()로 저장하고, 그 그래프를 만든 코드와 데이터 조건까지 함께 남겨야 같은 결과를 다시 만들 수 있습니다.
확인 가능한 결과는 저장된 파일과 재실행 가능성으로 드러납니다. train loss, validation loss, accuracy를 비교한 그림이 파일로 남아 있고, 같은 스크립트로 다시 생성할 수 있다면 그 그래프는 단순 캡처가 아니라 실험 기록으로 기능합니다.
체크리스트¶
- 여러 그래프를 배치하는 이유가 관련된 질문을 비교하기 위해서라는 점을 설명할 수 있는가?
plt.subplots(1, 2)가 하나의Figure안에 두Axes를 만든다는 점을 설명할 수 있는가?- 손실과 정확도를 나란히 비교해야 하는 이유를 설명할 수 있는가?
- train loss와 validation loss처럼 같은 단위의 값은 같은 축에서 비교할 수 있고, 단위가 다른 값은 나누어 봐야 한다는 점을 설명할 수 있는가?
plt.show()와fig.savefig()의 차이를 설명할 수 있는가?savefig()가 그래프를 이미지 파일로 저장하는 방법이며, 저장된 그래프가 재현 가능한 기록이 되려면 코드와 데이터 조건도 함께 남아야 한다는 점을 설명할 수 있는가?- 여러 그래프를 한 화면에서 나란히 놓고 비교해야 할 때 Figure와 Axes 배치를 먼저 떠올릴 수 있는가?
- 그래프 파일만으로는 재현성이 부족하다는 점을 다시 확인할 수 있는가?
출처와 참고 자료¶
- Matplotlib Developers,
Quick start guide, Matplotlib documentation, 확인 날짜: 2026-07-20. https://matplotlib.org/stable/users/explain/quick_start.html 하나의Figure안에 여러Axes를 둘 수 있다는 설명과plt.subplots()예제를 확인했습니다. - Matplotlib Developers,
Introduction to Axes (or Subplots), Matplotlib documentation, 확인 날짜: 2026-07-20. https://matplotlib.org/stable/users/explain/axes/axes_intro.htmlAxes가 데이터 좌표계와 라벨·제목·범례 설정의 중심 객체라는 설명의 근거입니다. - Matplotlib Developers,
matplotlib.figure.Figure.savefig, Matplotlib API reference, 확인 날짜: 2026-07-20. https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.savefig.htmlFigure.savefig()가 이미지나 벡터 그래픽 파일로 저장한다는 설명의 직접 참고 자료입니다.