
Matplotlib에서 그림을 그리는 함수는 matplotlib.pyplot에 존재하기 때문에 일반적으로 해당 부분을 plt로 alias하여 import한다.
import matplotlib.pyplot as plt
import numpy as np
plot() 함수를 사용하면 각 데이터를 연결하여 나타낸 선 도표를 얻을 수 있다.
x = np.arange(0, 10, 0.1)
y = np.sin(x)
z = np.cos(x)
plt.figure(figsize=(4, 4)) # 그림 크기 설정, 여기서 숫자는 인치 단위
plt.plot(x, y, color='red', ls='--', label='sin(x)') # 해당 선 도표의 색, 형태, 이름 설정
plt.plot(x, z, label='cos(x)')
plt.legend() # 범례 표시
plt.title("Line Chart") # 제목 설정
plt.xlabel("X values") # x축 이름 설정
plt.ylabel("Y values") # y축 이름 설정
plt.show() # 그림 보여주기
결과
위의 방식은 최초 벤치마킹한 MATLAB의 방식을 따르는 pyplot interface 방식이며, 객체적 특성을 활용하는 object-oriented interface로도 같은 그림을 얻을 수 있다.
# Object 방식으로 같은 그림 그리기
x = np.arange(0, 10, 0.1)
y = np.sin(x)
z = np.cos(x)
fig, ax = plt.subplots()
fig.set_size_inches(4, 4)
ax.plot(x, y, color='red', ls='--', label='sin(x)')
ax.plot(x, z, label='cos(x)')
ax.set_title("Line Chart")
ax.set_xlabel("X values")
ax.set_ylabel("Y values")
ax.legend()
plt.show()
결과
산점도는 각 데이터의 위치를 좌표에 점으로 나타내는 그래프이다.
산점도는 scatter() 함수를 사용하여 나타낼 수 있다.
x = np.random.rand(30)
y = np.random.rand(30)
sz = np.random.rand(30) * 100 # 각 점의 크기를 무작위로 설정하기 위한 변수
plt.scatter(x, y, marker='*', color='red', s=sz) # 점의 모양, 색깔, 크기 설정
plt.show()
결과
막대 그래프는 범주형 데이터의 값을 막대의 높이로 표현하는 그래프이다. 이를 통해 범주별 크기를 비교하거나 범주형 데이터의 분포를 확인할 수 있다.
막대 그래프는 bar() 함수를 사용하여 얻는다.
# Bar plot은 x축이 이산적인 범주를 나타내며, y축은 각 범주에 속하는 값을 나타낸다.
x = ['A', 'B', 'O', 'AB']
y = [10, 5, 6, 2]
plt.bar(x, y)
plt.show()
결과
히스토그램은 연속형 데이터를 일정 구간으로 나누고, 각 구간에 속하는 테이터의 개수를 막대의 높이로 표현하는 그래프이다. 이는 막대 그래프와 유사한 형태지만, 히스토그램은 연속형 데이터를 나타낸다는 차이점이 있다.
히스토그램은 hist() 함수를 사용하여 얻을 수 있다.
# 히스토그램은 x축이 연속적인 값이며, y축은 각 영역에 속하는 값의 개수를 나타낸다.
x = np.random.randn(1000)
plt.hist(x, bins=30) # bins는 동일한 간격으로 나누는 구간의 개수 설정
plt.show()
결과
박스 플롯은 숫자형 데이터의 사분위수를 표현하는 그래프이다.
박스 플롯은 'boxplot()' 함수로 얻을 수 있다.
# Box plot의 box는 위에서부터 75% 위치, median, 25% 위치를 나타낸다.
# 위 아래의 범위는 박스 크기의 1.5배로 얻어지고, 해당 범위에 모든 값이 들어있다고 생각한다
# 하지만 범위를 넘는 이상치가 존재할 수 있는데, 이걸 처리할 지는 그때그때 적절히 생각하면 된다
i1 = np.random.normal(0, 2.0, 1000)
i2 = np.random.normal(-3.0, 1.5, 500)
i3 = np.random.normal(1.2, 1.5, 1500)
plt.boxplot([i1, i2, i3])
plt.show()
결과

matplotlib의 그래프는 Figure 객체, Axes 객체, Axis 객체 등으로 구성된다.Figure 객체에 Axes를 추가하는 방식으로 하나의 Figure에 여러 그래프를 그릴 수 있다.
이때, subplot() 함수를 사용하는 pyplot 방식과 subplots() 함수를 사용하는 object-oriented 방식을 사용할 수 있다.
# 데이터 정의
x = np.linspace(0, 10, 30)
y = np.sin(x)
z = np.cos(x)
w = np.tan(x)
# pyplot interface로 그림 그리기
plt.figure(figsize=(12, 5))
# 영역이 2x2라면 첫 줄에 1 2, 다음 줄에 3 4의 영역을 사용한다
plt.subplot(2, 2, 1) # subplot(row, column, index)
plt.plot(x, y, 'r-')
plt.subplot(2, 2, 2)
plt.plot(x, y, 'g--')
plt.subplot(2, 2, 3)
plt.plot(x, y, 'b-')
plt.show()
# 이러한 특성 때문에 반복문을 사용하면 i+1로 사용해야 해서 별로 좋진 않다
for i in range(4):
plt.subplot(2, 2, i+1)
plt.plot(x, y, 'r-')
plt.show()
결과
Objected-oriented interface로도 같은 결과를 얻을 수 있다.
# Object-oriented interface로 그림 그리기
fig, axes = plt.subplots(2, 2) # subplots(row, column)
fig.set_size_inches(12, 5)
axes[0][0].plot(x, y, 'r-')
axes[0][1].plot(x, y, 'g--')
axes[1][0].plot(x, y, 'b-')
plt.show()
# 반복문을 사용할 때는 이중 루프를 사용하지 않고 flatten을 사용하면 된다
fig, axes = plt.subplots(2, 2)
axes = axes.flatten()
for i in range(4):
axes[i].plot(x, y, 'r-')
plt.show()
결과