15. Matplotlib 기초 그래프

🎯 이 장의 목표
  • Matplotlib으로 기본 그래프(선·산점·막대·원형·히스토그램)를 그린다
  • 그래프에 제목·축 이름·범례를 단다
  • 여러 그래프를 한 화면에 배치한다(서브플롯)
💡 팁
이 장부터는 결과가 그림입니다. 코드를 Colab에서 실행하면 그래프가 셀 아래에 바로 나타납니다. 글로는 "어떤 그래프가 나오는지" 설명하니, 꼭 직접 실행해 눈으로 확인하세요.

먼저: Matplotlib이 뭔가요?

Matplotlib(맷플롯립)은 파이썬에서 그래프를 그리는 가장 기본적인 라이브러리입니다. 거의 모든 종류의 그래프를 그릴 수 있고, 다른 시각화 도구(다음 장의 Seaborn 포함)도 대부분 이것 위에 지어져 있습니다.

보통 pyplot이라는 부분을 plt라는 별명으로 가져옵니다. 이것도 세계 공통 관례입니다.

PYTHON
import matplotlib.pyplot as plt
🔑 새 용어 — pyplot과 plt
matplotlib.pyplot은 Matplotlib에서 그래프를 그리는 명령들을 모아 둔 부분입니다. plt라는 짧은 별명으로 부릅니다. 앞으로 plt.plot(...), plt.show()처럼 씁니다.
⚠️ 흔한 실수
한글 깨짐 주의: Matplotlib은 기본 설정에서 한글이 네모(□)로 깨질 수 있습니다. 입문 단계에선 그래프의 글자(제목·라벨)를 영어로 쓰는 것을 권합니다. (한글 폰트 설정은 환경마다 달라 까다로우니, 익숙해진 뒤 따로 찾아보세요.)

선 그래프 (line plot)

값의 변화 추이를 볼 때 씁니다. 시간에 따른 변화에 특히 잘 맞습니다.

PYTHON
import matplotlib.pyplot as plt

months = [1, 2, 3, 4, 5, 6]
sales = [100, 120, 90, 150, 180, 160]

plt.plot(months, sales)
plt.title("Monthly Sales")     # 제목
plt.xlabel("Month")            # x축 이름
plt.ylabel("Sales")            # y축 이름
plt.show()                     # 그래프 표시

나오는 그래프: 가로축이 월(1~6), 세로축이 매출인 꺾은선 그래프가 나타납니다. 4월에 급등했다가 5월 정점, 6월에 살짝 내려오는 흐름이 한눈에 보입니다.

🔑 새 용어 — plt.show()
지금까지 명령한 그래프를 화면에 그려라는 마무리 명령입니다. Colab에선 없어도 보통 보이지만, 습관적으로 붙이면 깔끔합니다.

선의 모양·색을 바꿀 수 있습니다.

PYTHON
plt.plot(months, sales, color="red", marker="o", linestyle="--")
plt.title("Monthly Sales")
plt.show()

나오는 그래프: 빨간색 점선에 각 데이터 지점마다 동그란 마커가 찍힌 선 그래프가 나옵니다.

여러 선을 한 그래프에

plt.plot을 여러 번 부르면 한 그래프에 겹쳐 그려집니다. labellegend로 구분합니다.

PYTHON
import matplotlib.pyplot as plt

months = [1, 2, 3, 4, 5]
seoul = [100, 120, 90, 150, 180]
busan = [80, 95, 100, 110, 130]

plt.plot(months, seoul, label="Seoul", marker="o")
plt.plot(months, busan, label="Busan", marker="s")
plt.title("Sales by City")
plt.xlabel("Month")
plt.ylabel("Sales")
plt.legend()       # 범례 표시 (label들을 보여줌)
plt.show()

나오는 그래프: 서울·부산 두 도시의 매출선이 한 그래프에 그려지고, 오른쪽(또는 적절한 위치)에 어느 선이 어느 도시인지 알려 주는 범례(legend)가 표시됩니다.

🔑 새 용어 — 범례(legend)
그래프에서 어느 색·선이 무엇을 뜻하는지 알려 주는 작은 설명 상자입니다. label=로 이름을 붙이고 plt.legend()로 표시합니다.

산점도 (scatter plot)

두 값 사이의 관계를 점으로 봅니다. "X가 클수록 Y도 큰가?"를 살필 때 씁니다.

PYTHON
import matplotlib.pyplot as plt

study_hours = [1, 2, 3, 4, 5, 6, 7]
scores = [40, 50, 55, 65, 70, 85, 90]

plt.scatter(study_hours, scores)
plt.title("Study Hours vs Score")
plt.xlabel("Study Hours")
plt.ylabel("Score")
plt.show()

나오는 그래프: 공부 시간(x)과 점수(y)가 점으로 흩뿌려진 그래프가 나옵니다. 점들이 오른쪽 위로 올라가는 경향이라, "공부 시간이 길수록 점수가 높다"는 관계가 눈에 보입니다.

막대 그래프 (bar chart)

범주별 크기를 비교할 때 씁니다.

PYTHON
import matplotlib.pyplot as plt

fruits = ["Apple", "Banana", "Grape", "Orange"]
counts = [30, 45, 25, 35]

plt.bar(fruits, counts)
plt.title("Fruit Sales")
plt.ylabel("Count")
plt.show()

나오는 그래프: 과일 이름이 가로축, 판매량이 세로 막대로 나타나 어느 과일이 가장 많이 팔렸는지(바나나) 한눈에 보입니다. 가로 막대로 그리려면 plt.barh(...)를 씁니다.

원형 그래프 (pie chart)

전체에서 차지하는 비율을 볼 때 씁니다.

PYTHON
import matplotlib.pyplot as plt

labels = ["Mobile", "Desktop", "Tablet"]
sizes = [55, 35, 10]

plt.pie(sizes, labels=labels, autopct="%1.1f%%")
plt.title("Device Usage")
plt.show()

나오는 그래프: 세 기기의 사용 비율이 파이 조각으로 나뉘어 표시되고, autopct(자동 퍼센트) 덕분에 각 조각에 55.0%처럼 비율이 적힙니다.

💡 팁
: 원형 그래프는 항목이 많으면(5~6개 초과) 알아보기 어렵습니다. 항목이 많을 땐 막대 그래프가 보통 더 명확합니다.

히스토그램 (histogram)

🔑 새 용어 — 히스토그램(histogram)
값의 분포를 보는 그래프입니다. 값의 범위를 여러 구간(bin, 통)으로 나누고, 각 구간에 몇 개가 들어가는지 막대로 보여 줍니다. "점수가 주로 어디에 몰려 있나"를 살필 때 씁니다. (막대 그래프가 범주별 크기라면, 히스토그램은 숫자의 분포입니다.)
PYTHON
import matplotlib.pyplot as plt

scores = [55, 60, 62, 65, 65, 70, 72, 75, 75, 75, 80, 82, 85, 90, 95]

plt.hist(scores, bins=5)
plt.title("Score Distribution")
plt.xlabel("Score")
plt.ylabel("Frequency")
plt.show()

나오는 그래프: 점수를 5개 구간으로 나눠, 각 구간에 학생이 몇 명인지 막대로 보여 줍니다. 70~80 구간이 가장 높아 점수가 그 부근에 몰려 있음을 알 수 있습니다.

🔑 새 용어 — bin(빈, 구간)
히스토그램에서 값을 나누는 구간(통)입니다. bins=5면 5개 구간으로 나눕니다. 구간 수를 바꾸면 그래프 모양과 인상이 달라지니, 몇 가지 값을 시도해 보세요.

서브플롯: 여러 그래프를 한 화면에

plt.subplots로 여러 그래프를 격자로 배치합니다.

PYTHON
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [1, 4, 9, 16, 25]
y2 = [25, 16, 9, 4, 1]

fig, axes = plt.subplots(1, 2, figsize=(10, 4))   # 1행 2열

axes[0].plot(x, y1)
axes[0].set_title("Increasing")

axes[1].plot(x, y2)
axes[1].set_title("Decreasing")

plt.tight_layout()   # 간격 자동 정리
plt.show()

나오는 그래프: 왼쪽엔 증가하는 곡선, 오른쪽엔 감소하는 곡선이 나란히 두 칸으로 표시됩니다.

🔑 새 용어 — figure와 axes
  • figure(피규어): 그래프 전체가 담기는 도화지.
  • axes(액시스/액시즈): 그 안의 개별 그래프 한 칸. subplots(1, 2)는 도화지 하나에 그래프 칸 2개를 만듭니다.

서브플롯에서는 plt.title 대신 axes[0].set_title처럼 각 칸에 설정하는 점에 주의하세요.

Pandas에서 바로 그리기

데이터프레임·시리즈는 .plot()만으로 Matplotlib 그래프를 그릴 수 있어 아주 편리합니다.

PYTHON
import pandas as pd

df = pd.DataFrame({
    "월": [1, 2, 3, 4, 5],
    "매출": [100, 120, 90, 150, 180]
})

df.plot(x="월", y="매출", kind="line", marker="o", title="Sales")

나오는 그래프: 앞서 그린 선 그래프와 같은 결과가, 데이터프레임 메서드 한 줄로 나옵니다. kind를 바꾸면 종류가 달라집니다: "bar"(막대), "scatter"(산점), "hist"(히스토그램), "pie"(원형).

💡 팁
실전에선 이 df.plot(...) 방식을 가장 많이 씁니다. 데이터가 이미 데이터프레임에 있으니, 따로 x·y 리스트를 만들 필요 없이 바로 그릴 수 있으니까요.

🛠 미니 챌린지

PYTHON
import matplotlib.pyplot as plt
days = ["Mon", "Tue", "Wed", "Thu", "Fri"]
visitors = [120, 150, 100, 180, 200]
  1. 요일별 방문자 수를 막대 그래프로 그리고 제목을 다세요.
  2. 같은 데이터를 선 그래프로 그리되, 마커(o)를 표시하세요.
  3. [2,3,3,4,4,4,5,5,6,7] 데이터를 bins=4로 히스토그램을 그리세요.

✅ 미니 챌린지 해설

PYTHON
import matplotlib.pyplot as plt
days = ["Mon", "Tue", "Wed", "Thu", "Fri"]
visitors = [120, 150, 100, 180, 200]

# 1. 막대 그래프
plt.bar(days, visitors)
plt.title("Daily Visitors")
plt.ylabel("Visitors")
plt.show()

나오는 그래프: 5개 요일의 방문자 수 막대. 금요일이 가장 높습니다.

PYTHON
# 2. 선 그래프 + 마커
plt.plot(days, visitors, marker="o")
plt.title("Daily Visitors")
plt.show()

나오는 그래프: 같은 데이터의 꺾은선. 각 요일마다 동그란 점이 찍힙니다.

PYTHON
# 3. 히스토그램
data = [2,3,3,4,4,4,5,5,6,7]
plt.hist(data, bins=4)
plt.title("Distribution")
plt.show()

나오는 그래프: 값을 4구간으로 나눈 분포. 4 부근이 가장 높습니다.

이 장에서 배운 것

  • Matplotlib은 import matplotlib.pyplot as plt로 불러와 그래프를 그린다.
  • 선(plot)·산점(scatter)·막대(bar)·원형(pie)·히스토그램(hist)이 기본이다.
  • title·xlabel·ylabel·legend로 그래프를 설명하고, show()로 표시한다.
  • subplots로 여러 그래프를 한 화면에 배치한다(figure=도화지, axes=각 칸).
  • 데이터프레임은 df.plot(kind=...)으로 바로 그릴 수 있어 가장 편하다.

✍️ 확인 문제

  1. "값의 변화 추이"를 볼 때와 "범주별 크기 비교"를 볼 때 각각 어떤 그래프가 적합한가요?
  2. 막대 그래프와 히스토그램의 차이는 무엇인가요?
  3. 데이터프레임 df를 막대 그래프로 그리는 가장 간단한 코드는 무엇인가요?
다음 장에서는 더 적은 코드로 더 예쁜 통계 그래프를 그리는 Seaborn을 배웁니다.
👉 16. Seaborn으로 통계 시각화