5.1.2 간단한 직선 그래프 그리기
① 직선 그래프 그리기
다음 코드는 가장 간단하게 plot() 함수로 좌표 리스트를 사용해 직선을 그린 결과이다. 다음처럼 x가 없는 경우, x는 [0, 1, 2, 3, 4]에 대응한 좌표를 연결하는 직선의 그림을 그린다.

import matplotlib.pyplot as plt
plt.plot([10, 5, 25, 30, 20])
plt.show()
이러한 선 그래프는 시간에 따른 변화의 추세(Trend)를 볼 때 가장 좋습니다. 예를 들어, 시간에 따른 마법사의 마나(MP) 변화를 그려봅시다.
import matplotlib.pyplot as plt
# 5.1.2 데이터 준비 (시간, 현재 MP)
time = [0, 1, 2, 3, 4, 5]
mp = [100, 80, 60, 40, 20, 0]
plt.plot(time, mp)
plt.title("Time vs Mana (Battle)")
plt.xlabel("Time (sec)")
plt.ylabel("Mana Point")
plt.show()
다음 코드는 x와 y 각각 좌표 5개로 직선을 그린 결과이다. 한글 처리를 위한 코드는 노트북에서 이미 이전에 실행했다면 다시 코딩해 실행할 필요는 없다. plt.title() 함수로 제목을 표시할 수 있다.
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False
plt.plot([1, 3, 5, 7, 9], [8, 6, 17, 22, 3])
plt.title('직선 그래프 그리기')
plt.show()

Matplotlib은 이 외에도 다양한 플롯과 기능을 제공하므로, 데이터 시각화에 필요한 다양한 작업을 수행할 수 있다. Matplotlib은 또한 seaborn, pandas 등 다른 데이터 시각화와 데이터 분석 라이브러리들과 함께 사용되기도 한다.
② 그래프의 여러 속성
함수 plt.plot()에서 marker='o', linestyle='--', color='b', label='소수(Prime Numbers)' 등으로 다양한 그림의 속성을 지정할 수 있다. 다음은 x와 y 좌표 값을 그린 코드와 결과이다.
import matplotlib.pyplot as plt
# 5.1.2 데이터 생성
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
# 5.1.2 선 플롯 생성
plt.plot(x, y, marker='o', linestyle='-', color='b', label='소수(Prime Numbers)')
# 5.1.2 축 및 제목 설정
plt.xlabel('X-축(axis)')
plt.ylabel('Y-축(axis)')
plt.title('소수 크기(Prime Numbers Plot)')
plt.legend()
# 5.1.2 플롯 표시
plt.show()

속성 marker, linewidth, linestyle 등을 달리해 그린 결과이다.
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [10, 20, 30, 40], color='r', linestyle='--',
marker='d', linewidth=3, label='thick line')
plt.plot([1, 2, 3, 4], [40, 30, 20, 10], 'b', ls=':', marker='*', lw=0.5,
label='thin line')
plt.title('속성 marker linewidth linestyle')
plt.xlabel('X 축(axis)')
plt.ylabel('Y 축(axis)')
plt.legend()
plt.show()
③ 산점도
다음은 plt.scatter(x, y)로 좌표 부분에 속성 marker 유형을 찍는 산점도를 그린 그림이다. 마커의 기본은 'o'로 작은 원이다. 인자 s는 크기(size), c는 색상(color), alpha는 불투명도를 나타낸다.
import numpy as np
import matplotlib.pyplot as plt
# 5.1.2 Fixing random state for reproducibility
np.random.seed(2025)
N = 80
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (20 * np.random.rand(N))**2 # 5.1.2 to 15 point radii
plt.scatter(x, y, s=area, c=colors, alpha=0.7)
plt.colorbar()
plt.show()

다음은 논리 첨자(boolean index)를 만들어 모든 좌표 x와 y에서 mask1 또는 mask2를 만족하는 좌표만을 뽑아 산점도를 그리는 코드이다.
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(-100, 100, 1000) # 1000개의 랜덤 값 추출
y = np.random.randint(-100, 100, 1000) # 1000개의 랜덤 값 추출
mask1 = abs(x) > 50 # x에 저장된 값 중 절댓값이 50보다 큰 값 걸러 냄
mask2 = abs(y) > 50 # y에 저장된 값 중 절댓값이 50보다 큰 값 걸러 냄
x = x[mask1 + mask2] # mask1과 mask2 중 하나라도 만족하는 값 저장
y = y[mask1 + mask2] # mask1과 mask2 중 하나라도 만족하는 값 저장
plt.scatter(x, y, c=x, cmap='jet', alpha=0.4)
plt.colorbar()
plt.show()
다음은 모든 좌표 x와 y에서 mask1과 mask2를 모두 만족하는 좌표만을 뽑아 산점도를 그리는 코드이다. 그러므로 다음처럼 x와 y의 절댓값이 모두 50이 넘는 좌표만이 그려진다.
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(-100, 100, 1000) # 1000개의 랜덤 값 추출
y = np.random.randint(-100, 100, 1000) # 1000개의 랜덤 값 추출
mask1 = abs(x) > 50 # x에 저장된 값 중 절댓값이 50보다 큰 값 걸러 냄
mask2 = abs(y) > 50 # y에 저장된 값 중 절댓값이 50보다 큰 값 걸러 냄
x = x[mask1 * mask2] # mask1과 mask2 모두 만족하는 값 저장
y = y[mask1 * mask2] # mask1과 mask2 모두 만족하는 값 저장
plt.scatter(x, y, c=x, cmap='jet', alpha=0.4)
plt.colorbar()
plt.show()
④ 막대 그래프
함수 plt.bar()로 막대 그래프를 그릴 수 있다.
import matplotlib.pyplot as plt
plt.bar(["Red", "Green", "Blue"], [8, 5, 10])
plt.show()

인자 color에 색상 목록으로 각각의 막대에 색상을 지정할 수 있다.
import matplotlib.pyplot as plt
c = ["red", "green", "blue"]
plt.bar(c, [10, 4, 12], color=c, alpha=.4)
plt.show()
⑤ 히스토그램 hist()
함수 plt.hist()는 히스토그램을 그리는 함수이다. 함수 plt.figure(figsize=(6, 4))는 가로와 세로가 6인치, 4인치인 그림을 그린다.
import matplotlib.pyplot as plt
plt.figure(figsize=(6, 4)) # 그림 크기 지정
plt.hist([1, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 6], rwidth=.98, bins=[.5, 1.5,
2.5, 3.5, 4.5, 5.5, 6.5])
plt.xticks(range(1, 7))
plt.show()

함수 plt.savefig('파일명.png')는 그림을 파일 ‘파일명.png’로 저장한다.
import matplotlib.pyplot as plt
import numpy as np
dice = np.random.choice(range(1, 7), 1000000,
p=[0.15, 0.25, 0.3, 0.1, 0.1, 0.1])
plt.figure(figsize=(5, 3), dpi=200)
plt.hist(dice, rwidth=.98, bins=np.arange(.5, 7))
plt.xticks(range(1, 7))
plt.savefig('주사위.png')
plt.show()