이전 포스팅에서 matplotlib이나 seaborn을 통해서 그래프를 생성하면 자동으로 AxesSubplot 객체가 생성되었다. AxesSubplot은 Figure 객체에 포함된 객체이지만, 일반적으로는 하나밖에 생성이 안된다. 그러나, 데이터 시각화를 진행하다 보면, 아래처럼 여러 개의 그래프를 한 눈에 비교하고 싶을 때가 있다.
matplotlib에서는 서브플롯을 그리기 위해 몇 가지의 메서드를 제공한다.
1. add_subplot()
첫 번째는 바로 Figure 객체의 add_subplot() 메서드이다. add_subplot()은 파라미터로 row, col, index를 받는다. index는 서브플롯이 생성되는 위치로, 왼쪽 위에서부터 1이다.
아래 코드는 nrows=3, ncols=2의 빈 서브플롯 6개를 생성한 모습이다. 첫 번째 서브플롯에만 lineplot을 생성하였다.
fig = plt.figure(figsize=(8,8))
ax1 = fig.add_subplot(3,2,1)
ax2 = fig.add_subplot(3,2,2)
ax3 = fig.add_subplot(3,2,3)
ax4 = fig.add_subplot(3,2,4)
ax5 = fig.add_subplot(3,2,5)
ax6 = fig.add_subplot(3,2,6)
ax1.plot([0,1], [0,1], 'b-')
2. subplots()
두 번째는 subplots() 메서드이다. 기본 파라미터로 nrows와 ncols를 받는다. add_subplot() 메서드와 다르게 한 번에 nrows*ncols의 갯수의 subplot 객체를 만들어낸다. plt.subplots()로 사용이 가능하고, Figure 객체와 AxesSubplots 객체를 반환한다. 아래는 nrows=3, ncols=4의 subplot을 생성한 결과이다.
fig, ax = plt.subplots(3, 4, figsize=(10,10))
type(fig)
=>
matplotlib.figure.Figure
type(ax)
=>
matplotlib.axes._subplots.AxesSubplot
그리고 ax를 확인해보면 AxesSubplots 객체 리스트를 담고 있는 것을 볼 수 있다. 위의 결과로 인해, ax는 이중 리스트를 생성하였다.
ax
=>
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee90e8e0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee87aa60>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee836820>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee85f0a0>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee8166a0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee7c0e80>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee769670>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee777700>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee758460>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee702b80>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee6bb2e0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7efeee6e3a00>]],
dtype=object)
add_subplot() 메서드에서는 index를 통해 subplot 객체들에 접근을 하였지만, subplots()에서는 이중 리스트 인덱싱을 통해 접근 할 수 있다. 다음 코드는 홀수 번째 column에만 그래프를 그려준 예시이다.
for i in range(12):
if i % 2 == 0:
ax[i//4][i%4].plot([0,1], [0,2], 'r-')
fig
기본적인 subplot 생성 및 제어만 할 수 있어도 데이터 시각화의 결과물이 훨씬 더 유연하게 만들 수 있다. 그리고 더 나은 시각화를 통해 EDA 또한 더 잘할 수 있으며 결과적으로 더 나은 데이터 분석 결과를 만들 수 있다.
참고로 아래 코드는 15개의 서브플롯을 가진 첫 번째 그림을 생성한 코드이다.
# num features plotting -> boxplot
fig, ax = plt.subplots(3, 5, figsize=(20,12))
for i, col in enumerate(num_features):
sub = sns.boxplot(x='price_range', y=col, data = train, ax=ax[i//5][i%5])
sub.set_title(col, fontweight='bold')
sub.set_xlabel('')
sub.set_ylabel('')
desc = ax[2][4]
desc.text(0.5, 0.5, horizontalalignment='center', verticalalignment='center',
s = 'Num Features vs Price Range', fontweight='bold', fontsize=11)
desc.set_xticks([])
desc.set_yticks([])
AxesSubplot 객체는 앞에 접두어 'set_'을 붙여서 그래프 요소들을 정밀하게 조정 가능하다.
(ex: set_title(): AxesSubplot의 제목 생성, set_xlabel(): AxesSubplot의 x축 제어, ...)
'Data Science > EDA Practice' 카테고리의 다른 글
[EDA Practice] Seaborn 설정 (rc) (0) | 2023.06.23 |
---|---|
[EDA Practice] Figure, Axes 객체 (0) | 2023.02.09 |
[EDA Practice] 2023/W4 EDA Practice (0) | 2023.01.27 |
[EDA Practice] EDA란? (0) | 2023.01.20 |