본문 바로가기
Data Science/EDA Practice

[EDA Practice] Subplot 그리기

by 인사이티드 2023. 2. 9.

이전 포스팅에서 matplotlib이나 seaborn을 통해서 그래프를 생성하면 자동으로 AxesSubplot 객체가 생성되었다. AxesSubplot은 Figure 객체에 포함된 객체이지만, 일반적으로는 하나밖에 생성이 안된다. 그러나, 데이터 시각화를 진행하다 보면, 아래처럼 여러 개의 그래프를 한 눈에 비교하고 싶을 때가 있다.

15개의 서브플롯


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-')

nrows=3, ncols=2



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

nrows=3, ncols=4


그리고 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

 

홀수 번째 column에만 그래프 그리기


기본적인 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