plt.subplots()

우선, numpy를 통해 데이터를 생성해보겠습니다.

import numpy as np

# a는 np.linspace를 사용하여 0부터 10까지 11개의 균등한 간격의 숫자를 생성
a = np.linspace(0,10,11)
# b는 a의 각 원소를 4제곱한 값을 가진 배열
b = a ** 4

# x는 0부터 9까지의 정수 배열을 생성
x = np.arange(0,10)
# x의 각 원소에 2를 곱한 값을 가진 배열
y = 2 * x

 

plt.subplots() 객체는 더 자동화된 축 관리자로 작용합니다. 이로 인해 여러 플롯을 나란히 표시하는 것이 훨씬 쉬워집니다.

튜플 언패킹을 사용하여 Figure 객체와 numpy 배열의 축을 모두 잡는 방법에 주목하세요.

# plt.figure()와 유사하게 사용하되, 튜플 언패킹을 사용하여 fig와 axes를 가져옵니다
fig, axes = plt.subplots()

# 이제 axes 객체를 사용하여 플롯에 내용을 추가합니다
axes.plot(x, y, 'r')  # x와 y 데이터를 빨간색('r')으로 플롯합니다
axes.set_xlabel('x')  # x축 레이블을 'x'로 설정합니다
axes.set_ylabel('y')  # y축 레이블을 'y'로 설정합니다
axes.set_title('title')  # 플롯의 제목을 'title'로 설정합니다

코드 결과


행과 열 추가하기

subplots() 객체를 생성할 때 행(row)과 열(column)의 개수를 지정할 수 있습니다.

# 1행 2열 서브플롯의 빈 캔버스
fig, axes = plt.subplots(nrows=1, ncols=2)

코드 결과


축 객체에 플로팅하기

이전과 마찬가지로 축 객체에서 .plot() 메서드를 사용하여 플로팅을 수행 할 수 있으며, 각 축 객체에서 .set_ 메서드를 사용할 수도 있습니다.

# 배열 인덱스로 사용도 가능하며
fig,axes = plt.subplots(nrows=1,ncols=2)

axes[0].plot(a,b)
axes[1].plot(x,y)

# for문을 이용해서도 플로팅이 가능하다
fig,axes = plt.subplots(nrows=1,ncols=2)

for axe in axes:
    axe.plot(x,y)

배열 인덱스 사용 결과

 

여기서 atplotlib에서 자주 발생하는 문제 중 하나는 서브플롯이나 figure가 겹치는 것입니다.

이 문제를 해결하기 위해 fig.tight_layout() 또는 plt.tight_layout() 메서드를 사용할 수 있습니다. 이 메서드는 축의 위치를 자동으로 조정하여 캔버스 상에서 내용이 겹치지 않도록 합니다.


서브플롯의 파라미터

저희는 Figure 객체와 Axes를 모두 가지고 있다.

즉, 두 레벨에서 속성들을 수정할 수 있다는 의미입니다.

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))

# 축 매개변수를 먼저 설정합니다

# 축 레벨에서의 매개변수
axes[0][0].plot(a, b)  # 첫 번째 행 첫 번째 열의 서브플롯에 a와 b 데이터를 플롯합니다
axes[0][0].set_title('0 0 Title')  # 첫 번째 행 첫 번째 열의 서브플롯 제목을 '0 0 Title'로 설정합니다

axes[1][1].plot(x, y)  # 두 번째 행 두 번째 열의 서브플롯에 x와 y 데이터를 플롯합니다
axes[1][1].set_title('1 1 Title')  # 두 번째 행 두 번째 열의 서브플롯 제목을 '1 1 Title'로 설정합니다
axes[1][1].set_xlabel('1 1 X Label')  # 두 번째 행 두 번째 열의 서브플롯의 x축 레이블을 '1 1 X Label'로 설정합니다

axes[0][1].plot(y, x)  # 첫 번째 행 두 번째 열의 서브플롯에 y와 x 데이터를 플롯합니다
axes[1][0].plot(b, a)  # 두 번째 행 첫 번째 열의 서브플롯에 b와 a 데이터를 플롯합니다

# 전체 그림의 매개변수를 설정합니다

# Figure 레벨에서의 매개변수
fig.suptitle("Figure Level", fontsize=16)  # 전체 그림의 제목을 'Figure Level'로 설정하고, 제목의 글자 크기를 16으로 설정합니다

plt.show()  # 플롯을 화면에 표시합니다

이렇듯 두 개의 객체를 모두 가지고 있어 따로따로 속성들을 수정할 수 있습니다.


서브플롯의 수동 간격 조정

.subplots_adjust를 사용하여 간격을 수동으로 조정할 수 있습니다.

 

  • left = 0.125 # 서브플롯의 왼쪽 가장자리 위치
  • right = 0.9 # 서브플롯의 오른쪽 가장자리 위치
  • bottom = 0.1 # 서브플롯의 아래쪽 가장자리 위치
  • top = 0.9 # 서브플롯의 위쪽 가장자리 위치
  • wspace = 0.2 # 서브플롯 사이의 너비로 예약된 공간의 양, 평균 축 너비의 비율로 표현됨
  • hspace = 0.2 # 서브플롯 사이의 높이로 예약된 공간의 양, 평균 축 높이의 비율로 표현됨
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))

# 축 레벨에서의 매개변수 설정
axes[0][0].plot(a, b)
axes[1][1].plot(x, y)
axes[0][1].plot(y, x)
axes[1][0].plot(b, a)

# 서브플롯을 늘리기 위해 left, right, top, bottom을 사용합니다
# 서브플롯 간의 간격을 추가하기 위해 wspace, hspace를 사용합니다
fig.subplots_adjust(
    left=None, 
    bottom=None,
    right=None,
    top=None,
    wspace=0.9,
    hspace=0.1,
)

plt.show()

 

코드 결과

 

이상으로 subplot에 대해 알아보았습니다.

728x90

'Data Analyst > ML' 카테고리의 다른 글

[Zero-base]Linear Regression  (0) 2024.09.30
[Zero-Base] Machine Learning - 1  (0) 2024.09.27
ML - Matplotlib Figure Object  (1) 2024.09.10
ML - Matplotlib-Basics  (0) 2024.09.10
ML - PANDAS(Pivot-Tables)  (0) 2024.09.10
hmm06