Skip to main content

Matplotlib 기초

Matplotlib는 Python의 가장 기본적인 시각화 라이브러리입니다. 모든 차트를 세밀하게 제어할 수 있으며, Seaborn과 Pandas의 시각화도 내부적으로 Matplotlib를 사용합니다. Figure/Axes 구조를 이해하면 어떤 차트든 자유롭게 만들 수 있습니다.

학습 목표

  • Figure와 Axes의 관계를 이해하고 객체 지향 방식으로 차트를 그릴 수 있다
  • 선 그래프, 막대 그래프, 산점도를 그릴 수 있다
  • 제목, 레이블, 범례, 그리드 등 차트 요소를 설정할 수 있다
  • 차트 스타일을 변경하고 이미지로 저장할 수 있다

왜 중요한가

EDA에서 데이터를 시각적으로 탐색하는 것은 통계 수치만으로는 발견할 수 없는 패턴을 드러냅니다. 또한 분석 결과를 효과적으로 전달하려면 명확하고 깔끔한 시각화가 필수입니다.

Figure와 Axes

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() 후에는 Figure 객체가 초기화되므로, 저장이 필요하면 plt.savefig()plt.show() 전에 호출하세요. 또는 fig.savefig()처럼 Figure 객체를 직접 사용하면 순서에 관계없이 동작합니다.
%matplotlib inline이 설정된 상태에서 plt.show()를 호출하면 중복 표시될 수 있습니다. 셀 마지막에 plt.show() 하나만 호출하거나, ;을 끝에 추가하세요.

체크리스트

  • fig, ax = plt.subplots()로 차트를 생성할 수 있다
  • 선 그래프, 막대 그래프, 산점도를 그릴 수 있다
  • 제목, 레이블, 범례, 그리드를 설정할 수 있다
  • 차트 스타일과 한글 폰트를 설정할 수 있다
  • 차트를 이미지 파일로 저장할 수 있다

다음 문서