Matplotlib 기초 | Python 데이터 시각화 완벽 정리
이 글의 핵심
Matplotlib 기초: Python 데이터 시각화 Matplotlib 기본·선 그래프.
들어가며
”데이터를 그림으로”
Matplotlib은 데이터 시각화를 위한 Python의 표준 라이브러리입니다.
실무 활용 사례: 데이터 분석, 웹 개발, 자동화 프로젝트에서 실제로 사용한 패턴과 코드를 바탕으로 정리했습니다. 초보자가 흔히 겪는 오류와 해결법을 포함합니다.
1. Matplotlib 기본
설치
pip install matplotlib
첫 그래프
plt.plot(x, y)는 가로축·세로축 좌표 쌍을 이은 선을 그립니다. 보고서에 넣을 도표의 뼈대는 plot으로 잡고, xlabel·ylabel·title로 읽는 사람이 축 의미를 알 수 있게 적어 줍니다.
import matplotlib.pyplot as plt
# 데이터
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# 그래프 그리기
plt.plot(x, y)
plt.xlabel('X축')
plt.ylabel('Y축')
plt.title('선 그래프')
plt.show()
2. 선 그래프
기본 선 그래프
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)', color='blue', linestyle='-')
plt.plot(x, y2, label='cos(x)', color='red', linestyle='--')
plt.xlabel('x')
plt.ylabel('y')
plt.title('삼각함수')
plt.legend()
plt.grid(True)
plt.show()
3. 막대 그래프
기본 막대 그래프
categories = ['A', 'B', 'C', 'D']
values = [25, 40, 30, 55]
plt.bar(categories, values, color='skyblue')
plt.xlabel('카테고리')
plt.ylabel('값')
plt.title('막대 그래프')
plt.show()
가로 막대 그래프
plt.barh(categories, values, color='lightgreen')
plt.xlabel('값')
plt.ylabel('카테고리')
plt.title('가로 막대 그래프')
plt.show()
4. 히스토그램
다음 Python 예제 코드입니다.
# 정규 분포 데이터
data = np.random.randn(1000)
plt.hist(data, bins=30, color='purple', alpha=0.7, edgecolor='black')
plt.xlabel('값')
plt.ylabel('빈도')
plt.title('히스토그램')
plt.show()
5. 산점도
다음 Python 예제 코드입니다.
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
plt.colorbar()
plt.xlabel('X')
plt.ylabel('Y')
plt.title('산점도')
plt.show()
6. 여러 서브플롯
다음 Python 예제 코드입니다.
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# 1번 그래프
axes[0, 0].plot([1, 2, 3], [1, 4, 9])
axes[0, 0].set_title('선 그래프')
# 2번 그래프
axes[0, 1].bar(['A', 'B', 'C'], [3, 7, 5])
axes[0, 1].set_title('막대 그래프')
# 3번 그래프
axes[1, 0].hist(np.random.randn(100), bins=20)
axes[1, 0].set_title('히스토그램')
# 4번 그래프
axes[1, 1].scatter(np.random.rand(50), np.random.rand(50))
axes[1, 1].set_title('산점도')
plt.tight_layout()
plt.show()
7. 실전 예제
판매 데이터 시각화
import matplotlib.pyplot as plt
import pandas as pd
# 데이터
sales_data = pd.DataFrame({
'month': ['1월', '2월', '3월', '4월', '5월', '6월'],
'sales': [150, 180, 165, 220, 250, 240],
'profit': [30, 45, 35, 60, 75, 70]
})
# 그래프
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 매출 추이
ax1.plot(sales_data['month'], sales_data['sales'],
marker='o', linewidth=2, markersize=8)
ax1.set_title('월별 매출 추이', fontsize=14, fontweight='bold')
ax1.set_xlabel('월')
ax1.set_ylabel('매출 (만원)')
ax1.grid(True, alpha=0.3)
# 수익 막대 그래프
ax2.bar(sales_data['month'], sales_data['profit'],
color='green', alpha=0.7)
ax2.set_title('월별 수익', fontsize=14, fontweight='bold')
ax2.set_xlabel('월')
ax2.set_ylabel('수익 (만원)')
plt.tight_layout()
plt.savefig('sales_report.png', dpi=300)
plt.show()
그래프 스타일·폰트·크기 한 번에 맞추기
Matplotlib은 보고서에 넣을 도표를 그리는 도구입니다. style로 전체 톤을 맞추고, 한글은 OS에 맞는 폰트 이름을 rcParams에 지정해야 깨지지 않습니다. figsize와 색 팔레트를 먼저 정해 두면 여러 축을 그릴 때도 일관된 느낌을 유지하기 쉽습니다.
# 스타일 적용
plt.style.use('seaborn-v0_8')
# 한글 폰트 설정
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False
# 그래프 크기
plt.figure(figsize=(10, 6))
# 색상
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1']
실전 심화 보강
실전 예제: 회귀선이 있는 산점도 + 잔차 플롯 (완전 실행 예)
아래 스크립트는 numpy로 합성 데이터를 만들고, polyfit으로 1차 회귀선을 그린 뒤 잔차 분포를 함께 봅니다. 보고서용으로 savefig까지 포함했습니다.
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(42)
x = np.linspace(0, 10, 80)
y = 2.5 * x + 1.0 + rng.normal(0, 1.8, size=x.shape)
coef = np.polyfit(x, y, 1)
y_hat = np.poly1d(coef)(x)
residuals = y - y_hat
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 4), constrained_layout=True)
ax1.scatter(x, y, alpha=0.7, label="관측")
ax1.plot(x, y_hat, color="crimson", linewidth=2, label="1차 회귀")
ax1.set_title("산점도와 회귀선")
ax1.legend()
ax1.grid(True, alpha=0.3)
ax2.hist(residuals, bins=18, color="steelblue", edgecolor="black", alpha=0.85)
ax2.set_title("잔차 분포")
ax2.grid(True, alpha=0.3)
fig.savefig("regression_residuals.png", dpi=200)
plt.show()
자주 하는 실수
plt.show()후savefig를 호출해 빈 파일이 저장되는 경우(순서를 바꿔야 함).- 한글 레이블이 깨져 보고서가 unusable이 되는 경우(운영체제별 폰트 설정 필요).
- 객체지향 API와
pyplot상태 머신을 섞어 축이 엉뚱한 서브플롯에 그려지는 경우.
주의사항
- 과학 출판물은 벡터 포맷(PDF/SVG)을 선호합니다. 비트맵은
dpi를 명시하세요. - 색맹 친화 팔레트(
colorblind스타일,tab10대신cividis등)를 검토하세요.
실무에서는 이렇게
- 반복되는 스타일은 matplotlibrc 또는
plt.style.context로 팀 공통화합니다. - 대시보드가 아니라 리포트 자동화라면
plt.close(fig)로 Figure를 닫아 메모리를 반환합니다.
비교 및 대안
| 도구 | 장면 |
|---|---|
| Matplotlib | 세밀한 제어, 논문·백엔드 렌더 |
| Seaborn | 통계 플롯 빠른 프로토타입 |
| Plotly | 인터랙티브 웹 |
추가 리소스
내부 동작과 핵심 메커니즘
이 글의 주제는 「Matplotlib 기초 | Python 데이터 시각화 완벽 정리」입니다. 여기서는 앞선 설명을 구현·런타임 관점에서 한 번 더 압축합니다. 데이터 흐름과 실패 모드를 기준으로 생각하면, “입력이 어디서 검증되고, 핵심 연산이 어디서 일어나며, 부작용(I/O·네트워크·디스크)이 어디서 터지는가”가 한눈에 드러납니다.
처리 파이프라인(개념도)
flowchart TD A[입력·요청·이벤트] --> B[파싱·검증·디코딩] B --> C[핵심 연산·상태 전이] C --> D[부작용: I/O·네트워크·동시성] D --> E[결과·관측·저장]
알고리즘·프로토콜 관점에서의 체크포인트
- 불변 조건(Invariant): 각 단계가 만족해야 하는 조건(예: 버퍼 경계, 프로토콜 상태, 트랜잭션 격리)을 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
- 결정성: 동일 입력에 동일 출력이 보장되는 순수한 층과, 시간·네트워크에 의해 달라질 수 있는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
- 경계 비용: 직렬화/역직렬화, 문자 인코딩, syscall 횟수, 락 경합처럼 “한 번의 호출이 아니라 누적되는 비용”을 의심 목록에 넣습니다.
프로덕션 운영 패턴
실서비스에서는 기능 구현과 함께 관측·배포·보안·비용이 동시에 요구됩니다. 아래는 팀에서 자주 쓰는 최소 체크리스트입니다.
| 영역 | 운영 관점에서의 질문 |
|---|---|
| 관측성 | 요청 단위 상관 ID, 에러율/지연 분위수, 주요 의존성 타임아웃이 보이는가 |
| 안전성 | 입력 검증·권한·비밀 관리가 코드 경로마다 일관적인가 |
| 신뢰성 | 재시도는 멱등한 연산에만 적용되는가, 서킷 브레이커·백오프가 있는가 |
| 성능 | 캐시 계층·배치 크기·풀링·백프레셔가 데이터 규모에 맞는가 |
| 배포 | 롤백 룬북, 카나리, 마이그레이션 호환성이 문서화되어 있는가 |
운영 환경에서는 “개발자 PC에서는 재현되지 않던 문제”가 시간·부하·데이터 크기 때문에 드러납니다. 따라서 스테이징의 데이터 양·네트워크 지연을 가능한 한 현실에 가깝게 맞추는 것이 중요합니다.
문제 해결(Troubleshooting)
| 증상 | 가능 원인 | 조치 |
|---|---|---|
| 간헐적 실패 | 레이스 컨디션, 타임아웃, 외부 의존성 불안정 | 최소 재현 스크립트 작성, 분산 트레이스·로그 상관관계 확인 |
| 성능 저하 | N+1 쿼리, 동기 I/O, 잠금 경합, 과도한 직렬화 | 프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거 |
| 메모리 증가 | 캐시 무제한, 클로저/이벤트 구독 누수, 대용량 객체의 불필요한 복사 | 상한·TTL·스냅샷 비교(힙 덤프/트레이스) |
| 빌드·배포만 실패 | 환경 변수·권한·플랫폼 차이 | CI 로그와 로컬 diff, 컨테이너/런타임 버전 핀(pin) |
권장 디버깅 순서: (1) 최소 재현 만들기 (2) 최근 변경 범위 좁히기 (3) 의존성·환경 변수 차이 확인 (4) 관측 데이터로 가설 검증 (5) 수정 후 회귀·부하 테스트.
정리
핵심 요약
- Matplotlib: Python 시각화 라이브러리
- pyplot: 간단한 그래프 API
- 그래프 종류: 선, 막대, 히스토그램, 산점도
- 서브플롯: 여러 그래프 배치
- 스타일: 색상, 폰트, 레이아웃
다음 단계
관련 글
자주 묻는 질문 (FAQ)
Q. 이 내용을 실무에서 언제 쓰나요?
A. Matplotlib 기초: Python 데이터 시각화 완벽 정리. Matplotlib 기본·선 그래프로 흐름을 잡고 원리·코드·실무 적용을 한글로 정리합니다. Python·Matplotlib·데이터시각화 중심으로 설… 실무에서는 위 본문의 예제와 선택 가이드를 참고해 적용하면 됩니다.
Q. 선행으로 읽으면 좋은 글은?
A. 각 글 하단의 이전 글 또는 관련 글 링크를 따라가면 순서대로 배울 수 있습니다. Python 시리즈 목차에서 전체 흐름을 확인할 수 있습니다.
Q. 더 깊이 공부하려면?
A. cppreference와 해당 라이브러리 공식 문서를 참고하세요. 글 말미의 참고 자료 링크도 활용하면 좋습니다.
같이 보면 좋은 글 (내부 링크)
이 주제와 연결되는 다른 글입니다.
- NumPy 기초 | Python 수치 계산 라이브러리 완벽 정리
- Python 파일 처리 | 읽기, 쓰기, CSV, JSON 완벽 정리
- Python 예외 처리 | try-except, raise, 커스텀 예외 완벽 정리
이 글에서 다루는 키워드 (관련 검색어)
Python, Matplotlib, 데이터시각화, 그래프, 차트, 시각화 등으로 검색하시면 이 글이 도움이 됩니다.