15. Matplotlib 기초 그래프
- Matplotlib으로 기본 그래프(선·산점·막대·원형·히스토그램)를 그린다
- 그래프에 제목·축 이름·범례를 단다
- 여러 그래프를 한 화면에 배치한다(서브플롯)
먼저: Matplotlib이 뭔가요?
Matplotlib(맷플롯립)은 파이썬에서 그래프를 그리는 가장 기본적인 라이브러리입니다. 거의 모든 종류의 그래프를 그릴 수 있고, 다른 시각화 도구(다음 장의 Seaborn 포함)도 대부분 이것 위에 지어져 있습니다.
보통 pyplot이라는 부분을 plt라는 별명으로 가져옵니다. 이것도 세계 공통 관례입니다.
import matplotlib.pyplot as plt
🔑 새 용어 — pyplot과 pltmatplotlib.pyplot은 Matplotlib에서 그래프를 그리는 명령들을 모아 둔 부분입니다.plt라는 짧은 별명으로 부릅니다. 앞으로plt.plot(...),plt.show()처럼 씁니다.
선 그래프 (line plot)
값의 변화 추이를 볼 때 씁니다. 시간에 따른 변화에 특히 잘 맞습니다.
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에선 없어도 보통 보이지만, 습관적으로 붙이면 깔끔합니다.
선의 모양·색을 바꿀 수 있습니다.
plt.plot(months, sales, color="red", marker="o", linestyle="--") plt.title("Monthly Sales") plt.show()
나오는 그래프: 빨간색 점선에 각 데이터 지점마다 동그란 마커가 찍힌 선 그래프가 나옵니다.
여러 선을 한 그래프에
plt.plot을 여러 번 부르면 한 그래프에 겹쳐 그려집니다. label과 legend로 구분합니다.
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도 큰가?"를 살필 때 씁니다.
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)
범주별 크기를 비교할 때 씁니다.
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)
전체에서 차지하는 비율을 볼 때 씁니다.
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%처럼 비율이 적힙니다.
히스토그램 (histogram)
🔑 새 용어 — 히스토그램(histogram)
값의 분포를 보는 그래프입니다. 값의 범위를 여러 구간(bin, 통)으로 나누고, 각 구간에 몇 개가 들어가는지 막대로 보여 줍니다. "점수가 주로 어디에 몰려 있나"를 살필 때 씁니다. (막대 그래프가 범주별 크기라면, 히스토그램은 숫자의 분포입니다.)
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로 여러 그래프를 격자로 배치합니다.
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 그래프를 그릴 수 있어 아주 편리합니다.
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 리스트를 만들 필요 없이 바로 그릴 수 있으니까요.🛠 미니 챌린지
import matplotlib.pyplot as plt days = ["Mon", "Tue", "Wed", "Thu", "Fri"] visitors = [120, 150, 100, 180, 200]
- 요일별 방문자 수를 막대 그래프로 그리고 제목을 다세요.
- 같은 데이터를 선 그래프로 그리되, 마커(
o)를 표시하세요. [2,3,3,4,4,4,5,5,6,7]데이터를 bins=4로 히스토그램을 그리세요.
✅ 미니 챌린지 해설
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개 요일의 방문자 수 막대. 금요일이 가장 높습니다.
# 2. 선 그래프 + 마커 plt.plot(days, visitors, marker="o") plt.title("Daily Visitors") plt.show()
나오는 그래프: 같은 데이터의 꺾은선. 각 요일마다 동그란 점이 찍힙니다.
# 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=...)으로 바로 그릴 수 있어 가장 편하다.
✍️ 확인 문제
- "값의 변화 추이"를 볼 때와 "범주별 크기 비교"를 볼 때 각각 어떤 그래프가 적합한가요?
- 막대 그래프와 히스토그램의 차이는 무엇인가요?
- 데이터프레임
df를 막대 그래프로 그리는 가장 간단한 코드는 무엇인가요?
다음 장에서는 더 적은 코드로 더 예쁜 통계 그래프를 그리는 Seaborn을 배웁니다.
👉 16. Seaborn으로 통계 시각화