포스트

[Python 100일 챌린지] Day 67 - Matplotlib 기초

[Python 100일 챌린지] Day 67 - Matplotlib 기초

데이터를 그래프로 표현해봅시다! 📈

숫자만 보면 모르겠던 것들이 그래프로 보면 한눈에! Python으로 예쁜 차트 만들기, 생각보다 쉬워요! 🎨

(30-40분 완독 ⭐⭐)

💡 왜 데이터 시각화가 필요할까요?

숫자 데이터만 봤을 때:

1
매출: 100, 120, 115, 130, 145

“음… 대충 올라가는 것 같은데?” 🤔

그래프로 봤을 때: 📈 한눈에 상승 추세, 언제 떨어졌는지, 최고점이 보여요!

데이터 시각화는 숫자의 패턴과 인사이트를 빠르게 파악하게 해주는 강력한 도구예요!

🎯 오늘의 학습 목표

📚 사전 지식


🎯 학습 목표 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

💡 pyplotplt로 줄여쓰는 이유

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/2x + 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]
💡 힌트 보기

단계별 접근법:

  1. 먼저 한글 폰트 설정을 해야 해요
    • plt.rcParams['font.family'] 설정
  2. 두 그래프를 나란히 보여주려면?
    • plt.subplots(1, 2, figsize=(가로, 세로)) 사용
    • axes[0]이 첫 번째 그래프, axes[1]이 두 번째 그래프
  3. 선 그래프: axes[0].plot(months, sales)
  4. 막대 그래프: axes[1].bar(months, sales)
  5. 제목 추가: axes[0].set_title('제목')
  6. 마지막에: 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()

📝 오늘 배운 내용 정리

  1. 기본 구조: plt.plot(), plt.show()
  2. Figure/Axes: 도화지(Figure)와 그래프 영역(Axes)
  3. 선 그래프: plt.plot(x, y) - 추세 표현
  4. 막대 그래프: plt.bar(), plt.barh() - 비교 표현
  5. 꾸미기: title(), xlabel(), legend(), grid()
  6. 저장: plt.savefig('파일명.png')

🔗 관련 자료


📚 이전 학습

Day 66: Pandas 그룹화와 집계 ⭐⭐

어제는 groupby()와 피벗 테이블을 배웠어요!

📚 다음 학습

Day 68: 데이터 시각화 실전 ⭐⭐


“늦었다고 생각할 때가 가장 빠른 때입니다. 오늘도 한 걸음 성장했어요!” 🚀

Day 67/100 Phase 7: 데이터 분석 기초 #100DaysOfPython
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.