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 |