[Python 100일 챌린지] Day 67 - Matplotlib 기초
데이터를 그래프로 표현해봅시다! 📈
숫자만 보면 모르겠던 것들이 그래프로 보면 한눈에! Python으로 예쁜 차트 만들기, 생각보다 쉬워요! 🎨
(30-40분 완독 ⭐⭐)
💡 왜 데이터 시각화가 필요할까요?
숫자 데이터만 봤을 때:
1 매출: 100, 120, 115, 130, 145“음… 대충 올라가는 것 같은데?” 🤔
그래프로 봤을 때: 📈 한눈에 상승 추세, 언제 떨어졌는지, 최고점이 보여요!
데이터 시각화는 숫자의 패턴과 인사이트를 빠르게 파악하게 해주는 강력한 도구예요!
🎯 오늘의 학습 목표
📚 사전 지식
- Day 61: NumPy 기초 - 배열 다루기
- Day 63: Pandas 기초 - DataFrame 기본
🎯 학습 목표 1: Matplotlib 시작하기
💡 Matplotlib이란?
Mathematics + Plot + Library = Matplotlib
Python에서 가장 많이 사용되는 시각화 라이브러리예요!
- Excel 차트처럼 선 그래프, 막대 그래프, 파이 차트 등을 만들 수 있어요
- 커스터마이징이 자유로워서 원하는 대로 꾸밀 수 있어요
- Pandas, NumPy와 함께 사용하면 더욱 강력해요!
1.1 설치 및 임포트
1
pip install matplotlib
💡 이미 설치되어 있나요? Anaconda를 사용 중이라면 Matplotlib이 이미 포함되어 있어요!
1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
# 한글 폰트 설정 (Mac)
plt.rcParams['font.family'] = 'AppleGothic'
# Windows의 경우
# plt.rcParams['font.family'] = 'Malgun Gothic'
# 마이너스 기호 깨짐 방지
plt.rcParams['axes.unicode_minus'] = False
💡
pyplot을plt로 줄여쓰는 이유
matplotlib.pyplot은 너무 길어서 매번 타이핑하기 힘들어요! 그래서plt라는 별명(alias)을 붙여서 사용해요. 이건 Python 커뮤니티의 관례(convention)이니 꼭 기억하세요!
1.2 첫 번째 그래프
1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
# 데이터
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# 그래프 그리기
plt.plot(x, y)
# 화면에 표시
plt.show()
💡 plt.show() 참고: Jupyter Notebook에서는
plt.show()없이도 그래프가 자동으로 표시돼요. 하지만.py스크립트 파일에서는 반드시plt.show()를 호출해야 그래프 창이 열립니다!
1.3 기본 구조: Figure와 Axes
Matplotlib의 그래프는 두 가지 핵심 요소로 구성됩니다:
- Figure: 전체 그림(도화지) - 그래프를 담는 큰 틀
- Axes: 실제 그래프 영역 - 데이터가 그려지는 공간
💡 비유로 이해하기: Figure는 도화지, Axes는 도화지 위에 그려진 그래프 영역이에요. 하나의 도화지(Figure)에 여러 개의 그래프 영역(Axes)을 배치할 수 있어요!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt
# 1. Figure (도화지)와 Axes (그래프 영역) 생성
fig, ax = plt.subplots()
# fig: 전체 그림 객체
# ax: 그래프를 그릴 영역 객체
# 2. 데이터 그리기
ax.plot([1, 2, 3], [1, 4, 9])
# 3. 꾸미기
ax.set_title('제곱 그래프')
ax.set_xlabel('X축')
ax.set_ylabel('Y축')
# 4. 표시
plt.show()
🎯 학습 목표 2: 선 그래프 그리기
2.1 기본 선 그래프
1
2
3
4
5
6
7
8
9
10
import matplotlib.pyplot as plt
months = ['1월', '2월', '3월', '4월', '5월']
sales = [100, 120, 115, 130, 145]
plt.plot(months, sales)
plt.title('월별 매출')
plt.xlabel('월')
plt.ylabel('매출(만원)')
plt.show()
2.2 여러 선 그리기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import matplotlib.pyplot as plt
months = ['1월', '2월', '3월', '4월', '5월']
product_a = [100, 120, 115, 130, 145]
product_b = [80, 95, 110, 105, 120]
plt.plot(months, product_a, label='제품A')
plt.plot(months, product_b, label='제품B')
plt.title('제품별 월 매출')
plt.xlabel('월')
plt.ylabel('매출(만원)')
plt.legend() # 범례 표시
plt.show()
2.3 선 스타일 변경
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y1 = [1, 2, 3, 4, 5]
y2 = [1, 4, 9, 16, 25]
# 다양한 스타일
plt.plot(x, y1, 'r-', label='선형') # 빨간 실선
plt.plot(x, y2, 'b--', label='제곱') # 파란 점선
# 마커 추가
# plt.plot(x, y1, 'ro-') # 빨간 원형 마커 + 실선
# plt.plot(x, y2, 'bs--') # 파란 사각 마커 + 점선
plt.legend()
plt.show()
💡 스타일 옵션 정리표
색상 (Color)
코드 색상 코드 색상 r빨강 (Red) c청록 (Cyan) g초록 (Green) m자홍 (Magenta) b파랑 (Blue) y노랑 (Yellow) k검정 (Black) w흰색 (White) 선 스타일 (Line Style)
코드 스타일 설명 -━━━━ 실선 (solid) --─ ─ ─ 점선 (dashed) :······ 점 (dotted) -.─·─·─ 점선혼합 (dashdot) 마커 (Marker)
코드 모양 코드 모양 o● 원 ^▲ 삼각형 s■ 사각형 v▼ 역삼각형 *★ 별 ++ 플러스 x× 엑스 D◆ 다이아몬드 조합 예시:
'ro-'= 빨간(r) + 원 마커(o) + 실선(-)
🎯 학습 목표 3: 막대 그래프 그리기
💡 선 그래프 vs 막대 그래프, 언제 쓸까?
그래프 종류 언제 사용? 예시 선 그래프 ( plot)시간에 따른 변화/추세 월별 매출 추이, 기온 변화 막대 그래프 ( bar)항목 간 크기 비교 과목별 점수, 제품별 판매량
3.1 기본 막대 그래프
1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D']
values = [25, 40, 30, 35]
plt.bar(categories, values)
plt.title('카테고리별 값')
plt.show()
3.2 가로 막대 그래프
1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
categories = ['Python', 'Java', 'JavaScript', 'C++']
popularity = [30, 25, 20, 15]
plt.barh(categories, popularity)
plt.title('프로그래밍 언어 인기도')
plt.xlabel('인기도 (%)')
plt.show()
3.3 그룹 막대 그래프
여러 데이터를 나란히 비교할 때 유용해요!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import matplotlib.pyplot as plt
import numpy as np
categories = ['1분기', '2분기', '3분기', '4분기']
product_a = [100, 120, 130, 150]
product_b = [80, 100, 110, 120]
# x 좌표를 숫자로 변환 (0, 1, 2, 3)
x = np.arange(len(categories)) # [0, 1, 2, 3]
width = 0.35 # 막대 너비
fig, ax = plt.subplots()
# 제품A: x 위치에서 왼쪽으로 width/2 만큼 이동
ax.bar(x - width/2, product_a, width, label='제품A')
# 제품B: x 위치에서 오른쪽으로 width/2 만큼 이동
ax.bar(x + width/2, product_b, width, label='제품B')
ax.set_xticks(x) # x축 눈금 위치 설정
ax.set_xticklabels(categories) # 눈금에 라벨 표시
ax.legend()
ax.set_title('분기별 제품 매출')
plt.show()
💡 x 좌표 계산 이해하기:
x - width/2와x + width/2로 두 막대가 중심(x)을 기준으로 양쪽에 나란히 배치돼요!
🎯 학습 목표 4: 그래프 꾸미기
4.1 제목과 레이블
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y)
# 제목 (폰트 크기 지정)
plt.title('매출 추이', fontsize=16)
# 축 레이블
plt.xlabel('월', fontsize=12)
plt.ylabel('매출(억)', fontsize=12)
plt.show()
4.2 그리드와 범례
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
plt.plot(x, y1, label='A팀')
plt.plot(x, y2, label='B팀')
# 그리드 추가
plt.grid(True, linestyle='--', alpha=0.7)
# 범례 위치 지정
plt.legend(loc='upper left') # 왼쪽 위
plt.title('팀별 성과')
plt.show()
💡 범례(legend) 위치 옵션
옵션 위치 옵션 위치 'upper left'왼쪽 위 'upper right'오른쪽 위 'lower left'왼쪽 아래 'lower right'오른쪽 아래 'center'가운데 'best'자동 최적 위치
4.3 색상과 스타일
1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D']
values = [25, 40, 30, 35]
# 색상 지정
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']
plt.bar(categories, values, color=colors)
plt.title('컬러풀한 차트')
plt.show()
4.4 그래프 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y)
plt.title('저장할 그래프')
# 파일로 저장
plt.savefig('my_chart.png', dpi=300, bbox_inches='tight')
# dpi: 해상도, bbox_inches='tight': 여백 최소화
plt.show()
💡 savefig() 주요 옵션
옵션 설명 권장값 dpi해상도 (dots per inch) 웹용: 100, 인쇄용: 300 bbox_inches여백 처리 'tight'(여백 최소화)format파일 형식 'png','pdf','svg'⚠️ 주의:
plt.savefig()는plt.show()앞에 호출해야 해요!show()이후에는 그래프가 초기화되어 빈 이미지가 저장될 수 있어요.
💡 실전 팁
✅ 자주 쓰는 패턴
1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt
# 여러 그래프 한 번에 (subplot)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].plot([1,2,3], [1,2,3])
axes[0].set_title('그래프 1')
axes[1].bar(['A','B','C'], [10,20,15])
axes[1].set_title('그래프 2')
plt.tight_layout() # 자동 간격 조정
plt.show()
✅ 한글 폰트 문제 해결
1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
import platform
# OS별 자동 설정
if platform.system() == 'Darwin': # Mac
plt.rcParams['font.family'] = 'AppleGothic'
elif platform.system() == 'Windows':
plt.rcParams['font.family'] = 'Malgun Gothic'
else: # Linux
plt.rcParams['font.family'] = 'NanumGothic'
plt.rcParams['axes.unicode_minus'] = False
🧪 연습 문제
문제: 월별 매출 시각화
다음 데이터로 1) 선 그래프, 2) 막대 그래프를 각각 그리세요.
1
2
months = ['1월', '2월', '3월', '4월', '5월', '6월']
sales = [120, 135, 128, 145, 160, 175]
💡 힌트 보기
단계별 접근법:
- 먼저 한글 폰트 설정을 해야 해요
plt.rcParams['font.family']설정
- 두 그래프를 나란히 보여주려면?
plt.subplots(1, 2, figsize=(가로, 세로))사용axes[0]이 첫 번째 그래프,axes[1]이 두 번째 그래프
- 선 그래프:
axes[0].plot(months, sales) - 막대 그래프:
axes[1].bar(months, sales) - 제목 추가:
axes[0].set_title('제목') - 마지막에:
plt.tight_layout()으로 간격 자동 조정
유용한 옵션들:
- 선 그래프 스타일:
'bo-'(파란 원 마커 + 실선) - 막대 색상:
color=['색1', '색2', ...] - 그리드:
axes[0].grid(True, linestyle='--')
✅ 정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import matplotlib.pyplot as plt
# 한글 폰트 설정
plt.rcParams['font.family'] = 'AppleGothic'
plt.rcParams['axes.unicode_minus'] = False
months = ['1월', '2월', '3월', '4월', '5월', '6월']
sales = [120, 135, 128, 145, 160, 175]
# 1. 선 그래프
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].plot(months, sales, 'bo-', linewidth=2, markersize=8)
axes[0].set_title('월별 매출 추이 (선 그래프)', fontsize=14)
axes[0].set_xlabel('월')
axes[0].set_ylabel('매출(만원)')
axes[0].grid(True, linestyle='--', alpha=0.7)
# 2. 막대 그래프
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', '#DDA0DD']
axes[1].bar(months, sales, color=colors)
axes[1].set_title('월별 매출 현황 (막대 그래프)', fontsize=14)
axes[1].set_xlabel('월')
axes[1].set_ylabel('매출(만원)')
plt.tight_layout()
plt.show()
📝 오늘 배운 내용 정리
- 기본 구조:
plt.plot(),plt.show() - Figure/Axes: 도화지(Figure)와 그래프 영역(Axes)
- 선 그래프:
plt.plot(x, y)- 추세 표현 - 막대 그래프:
plt.bar(),plt.barh()- 비교 표현 - 꾸미기:
title(),xlabel(),legend(),grid() - 저장:
plt.savefig('파일명.png')
🔗 관련 자료
- Matplotlib 공식 문서
- Matplotlib 갤러리 - 다양한 그래프 예제
📚 이전 학습
Day 66: Pandas 그룹화와 집계 ⭐⭐
어제는 groupby()와 피벗 테이블을 배웠어요!
📚 다음 학습
Day 68: 데이터 시각화 실전 ⭐⭐
“늦었다고 생각할 때가 가장 빠른 때입니다. 오늘도 한 걸음 성장했어요!” 🚀
Day 67/100 Phase 7: 데이터 분석 기초 #100DaysOfPython
