[Matplotlib 강좌 – 4] Matplotlib의 Figure와 Subplot 이해하기: 복잡한 그래프 구성하기

1. Figure 개념 이해하기

 

Matplotlib에서의Figure는 그래프를 그리기 위한 캔버스 같은 개념입니다. 'Figure'는 하나 이상의 'Axes'(그래프)를 포함할 수 있습니다. 여러 개의 그래프를 동시에 그릴 때, 각각의 그래프는 별도의 Figure에 속하게 됩니다. Figure는 다음과 같이 생성할 수 있습니다.

 

import matplotlib.pyplot as plt

fig = plt.figure()  # 빈 Figure 생성
plt.show()

 

plt.figure() 함수는 새로운 그림을 생성하며, 다음과 같은 매개변수가 있습니다.

 

  • num : 그림의 고유 번호 또는 이름. 이 매개변수를 사용하면 나중에 그림을 참조할 수 있습니다.
  • figsize : 그림의 너비와 높이를 지정하는 튜플입니다. 단위는 인치입니다.
  • dpi : 그림의 해상도를 지정하는 정수값. "dots per inch"의 약자입니다.
  • facecolor : 그림의 배경색을 지정하는 색상값입니다.
  • edgecolor : 그림의 테두리 색을 지정하는 색상값입니다.
  • frameon : 그림의 프레임을 그릴지 여부를 지정하는 불린 값입니다.

 

아래 코드의 figure()는 고유 이름을 'Sine Wave'로 설정하고, 크기를 10x6 인치로, 해상도를 100 dpi로 설정합니다. 또한, 그림의 배경색을 'lightgray'로, 테두리 색을 'black'으로 설정합니다. 마지막으로, 그림의 프레임을 그리도록 설정합니다.

 

 

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

# 그림 생성
plt.figure(num='Sine Wave', figsize=(10, 6), dpi=100, facecolor='lightgray', edgecolor='black', frameon=True)

# 그래프 플롯
plt.plot(x, y, label="sin(x)")

# 레이블 및 타이틀 설정
plt.xlabel('x')
plt.ylabel('y')
plt.title('Sine Wave')
plt.legend()

# 그래프 표시
plt.show()

 


2. Subplot 사용법

 

Figure 내에는 하나 이상의 Subplot(서브 플롯)이 포함될 수 있습니다. 서브 플롯은 Figure 내의 개별 그래프를 나타내며, 여러 개의 그래프를 그리드 형태로 배열할 때 유용합니다. plt.subplots() 함수는 그림(Figure)과 서브플롯 객체의 배열(Axes)을 반환합니다. 서브 플롯은 다음과 같이 생성할 수 있습니다.

 

 

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

fig, axs = plt.subplots(2, 2)

axs[0, 0].plot(x, y)
axs[0, 0].set_title('Axis [0, 0]')

axs[0, 1].plot(x, y, 'tab:orange')
axs[0, 1].set_title('Axis [0, 1]')

axs[1, 0].plot(x, -y, 'tab:green')
axs[1, 0].set_title('Axis [1, 0]')

axs[1, 1].plot(x, -y, 'tab:red')
axs[1, 1].set_title('Axis [1, 1]')

for ax in axs.flat:
    ax.set(xlabel='x-label', ylabel='y-label')

# 가장 외부에 위치한 축의 레이블만 표시하게 합니다. 
for ax in axs.flat:
    ax.label_outer()

plt.show()

 


3. add_subplot() 사용

 

add_subplot() 메서드는 Matplotlib의 Figure 객체에 subplot(부분 그래프)를 추가하는 데 사용됩니다. 이 메서드는 subplot을 추가하고, 그 위치를 지정하며, 반환된 축 객체(Axes)를 사용해 그래프를 그립니다.

 

import matplotlib.pyplot as plt

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)  # 첫 번째 subplot 추가
ax2 = fig.add_subplot(2, 2, 2)  # 두 번째 subplot 추가
ax3 = fig.add_subplot(2, 2, 3)  # 세 번째 subplot 추가
ax4 = fig.add_subplot(2, 2, 4)  # 네 번째 subplot 추가

plt.show()

 

add_subplot() 메서드의 주요 매개변수는 다음과 같습니다.

 

  • nrows : 전체 행의 수를 지정합니다.
  • ncols : 전체 열의 수를 지정합니다.
  • index : 생성할 subplot의 인덱스를 지정합니다. 이 인덱스는 왼쪽에서 오른쪽, 위에서 아래로 1부터 시작합니다.
  • projection : 그래프의 유형을 지정합니다. 예를 들어, 'polar'를 지정하면 극 좌표 그래프를 생성합니다.
  • sharex, sharey : 다른 Axes 객체와 x축 또는 y축을 공유하도록 지정합니다.

 

 

import numpy as np
import matplotlib.pyplot as plt

# 데이터 생성
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

fig = plt.figure(figsize=(8, 6))

# 첫 번째 subplot 추가 (위치: 왼쪽 상단, 극 좌표)
ax1 = fig.add_subplot(2, 2, 1, projection='polar')
ax1.plot(x, y)
ax1.set_title('First Subplot')

# 두 번째 subplot 추가 (위치: 오른쪽 상단, 직교 좌표)
ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(x, y)
ax2.set_title('Second Subplot')

# 세 번째 subplot 추가 (위치: 왼쪽 하단, 직교 좌표, x축 공유)
ax3 = fig.add_subplot(2, 2, 3, sharex=ax2)
ax3.plot(x, y**2)
ax3.set_title('Third Subplot (Share x-axis with Second Subplot)')

# 네 번째 subplot 추가 (위치: 오른쪽 하단, 직교 좌표, x축 공유)
ax4 = fig.add_subplot(2, 2, 4, sharex=ax2)
ax4.plot(x, y**3)
ax4.set_title('Fourth Subplot (Share x-axis with Second Subplot)')

plt.tight_layout()  # 그래프 간 간격 조절
plt.show()