Matplotlib 기초
Matplotlib는 Python의 가장 기본적인 시각화 라이브러리입니다. 모든 차트를 세밀하게 제어할 수 있으며, Seaborn과 Pandas의 시각화도 내부적으로 Matplotlib를 사용합니다. Figure/Axes 구조를 이해하면 어떤 차트든 자유롭게 만들 수 있습니다.
학습 목표
Figure와 Axes의 관계를 이해하고 객체 지향 방식으로 차트를 그릴 수 있다
선 그래프, 막대 그래프, 산점도를 그릴 수 있다
제목, 레이블, 범례, 그리드 등 차트 요소를 설정할 수 있다
차트 스타일을 변경하고 이미지로 저장할 수 있다
왜 중요한가
EDA에서 데이터를 시각적으로 탐색하는 것은 통계 수치만으로는 발견할 수 없는 패턴을 드러냅니다. 또한 분석 결과를 효과적으로 전달하려면 명확하고 깔끔한 시각화가 필수입니다.
import matplotlib.pyplot as plt
import numpy as np
# 방법 1: 객체 지향 (권장)
fig, ax = plt.subplots( figsize = ( 8 , 5 ))
ax.plot([ 1 , 2 , 3 , 4 ], [ 10 , 20 , 25 , 30 ])
ax.set_title( '매출 추이' )
ax.set_xlabel( '분기' )
ax.set_ylabel( '매출 (억원)' )
plt.show()
# 방법 2: pyplot (간단한 차트)
plt.figure( figsize = ( 8 , 5 ))
plt.plot([ 1 , 2 , 3 , 4 ], [ 10 , 20 , 25 , 30 ])
plt.title( '매출 추이' )
plt.show()
객체 지향 방식(fig, ax = plt.subplots())을 사용하면 여러 서브플롯을 다루기 쉽고, 코드가 명확해집니다. 습관적으로 객체 지향 방식을 사용하세요.
선 그래프 (Line Plot)
x = np.linspace( 0 , 10 , 100 )
fig, ax = plt.subplots( figsize = ( 8 , 5 ))
# 여러 선 그리기
ax.plot(x, np.sin(x), label = 'sin(x)' , color = '#4a9eca' , linewidth = 2 )
ax.plot(x, np.cos(x), label = 'cos(x)' , color = '#e6a23c' , linestyle = '--' )
# 차트 꾸미기
ax.set_title( '삼각함수' , fontsize = 14 , fontweight = 'bold' )
ax.set_xlabel( 'x' )
ax.set_ylabel( 'y' )
ax.legend( loc = 'upper right' )
ax.grid( True , alpha = 0.3 )
ax.set_xlim( 0 , 10 )
ax.set_ylim( - 1.5 , 1.5 )
plt.tight_layout()
plt.show()
막대 그래프 (Bar Plot)
categories = [ '개발' , '영업' , '마케팅' , '인사' ]
values = [ 45 , 38 , 28 , 15 ]
fig, ax = plt.subplots( figsize = ( 8 , 5 ))
bars = ax.bar(categories, values, color = [ '#4a9eca' , '#4a9e4a' , '#e6a23c' , '#666666' ])
# 값 표시
for bar, val in zip (bars, values):
ax.text(bar.get_x() + bar.get_width() / 2 , bar.get_height() + 0.5 ,
str (val), ha = 'center' , va = 'bottom' , fontweight = 'bold' )
ax.set_title( '부서별 인원 수' )
ax.set_ylabel( '인원' )
plt.tight_layout()
plt.show()
산점도 (Scatter Plot)
np.random.seed( 42 )
x = np.random.randn( 100 )
y = x * 2 + np.random.randn( 100 ) * 0.5
fig, ax = plt.subplots( figsize = ( 8 , 6 ))
scatter = ax.scatter(x, y, c = y, cmap = 'viridis' , alpha = 0.7 , edgecolors = 'white' )
fig.colorbar(scatter, ax = ax, label = 'y값' )
ax.set_title( '산점도 예시' )
ax.set_xlabel( 'X' )
ax.set_ylabel( 'Y' )
plt.tight_layout()
plt.show()
스타일 설정
# 전역 스타일 변경
plt.style.use( 'seaborn-v0_8-whitegrid' ) # 추천 스타일
# 한글 폰트 설정 (macOS)
plt.rcParams[ 'font.family' ] = 'AppleGothic'
plt.rcParams[ 'axes.unicode_minus' ] = False # 마이너스 기호 깨짐 방지
# 이미지 저장
fig.savefig( 'chart.png' , dpi = 150 , bbox_inches = 'tight' , facecolor = 'white' )
fig.savefig( 'chart.pdf' , bbox_inches = 'tight' ) # 벡터 형식
AI/ML에서의 활용
학습 곡선 : epoch별 loss/accuracy를 선 그래프로 모니터링합니다
피처 분포 : 히스토그램과 박스플롯으로 피처 분포를 확인합니다
모델 비교 : 막대 그래프로 여러 모델의 성능 지표를 비교합니다
예측 vs 실제 : 산점도로 예측값과 실제값의 상관관계를 확인합니다
plt.show()와 plt.savefig()를 같이 쓸 수 있나요?
plt.show() 후에는 Figure 객체가 초기화되므로, 저장이 필요하면 plt.savefig()를 plt.show() 전에 호출하세요. 또는 fig.savefig()처럼 Figure 객체를 직접 사용하면 순서에 관계없이 동작합니다.
Jupyter에서 차트가 두 번 표시되는 이유는?
%matplotlib inline이 설정된 상태에서 plt.show()를 호출하면 중복 표시될 수 있습니다. 셀 마지막에 plt.show() 하나만 호출하거나, ;을 끝에 추가하세요.
체크리스트
다음 문서