logo

[데이터 시각화 소개] matplotlib subplots

데이터 시각화 도구로서, matplotlib는 Python에서 가장 인기 있는 라이브러리 중 하나입니다. 복잡한 데이터를 시각화하는 데 있어서 matplotlib는 강력한 기능을 제공하며, 그 중 하나가 바로 여러 그래프를 하나의 창(window)에서 다룰 수 있는 subplots 기능입니다. 이번 섹션에서는 matplotlib의 subplots의 기본 사용법을 소개하려 합니다. 추가적으로 seaborn 코드 예시도 제공하여, 더 예쁜 그래프를 쉽게 그릴 수 있는 방법도 소개할 것입니다.

 

matplotlib를 사용한 Subplots 생성

matplotlib 라이브러리에 내장된 subplots 함수를 이용하여 쉽게 여러 subplot을 생성할 수 있습니다. 기본적으로 subplots()는 두 개의 객체를 반환합니다: Figure 객체와 Axes 객체(들).

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

위 코드는 가장 기본적인 형태로, 하나의 그래프만을 포함하는 Figure를 생성합니다.

 

Subplots의 기본 구조 이해하기

Figure와 Axes의 관계

Figure는 전체 창을 의미하며, 이 안에 하나 또는 여러 개의 Axes(subplot들)를 포함할 수 있습니다. 각 Axes 객체는 하나의 그래프를 담당하며, 축, 타이틀, 데이터 포인트 등을 포함할 수 있습니다.

Subplots와 subplot의 차이점

subplots 함수는 여러 개의 subplot을 한 번에 생성하고 배열하게 해주는 반면, subplot 함수는 단일 subplot을 추가합니다. subplots는 주로 여러 그래프를 동시에 생성하고 싶을 때 사용하며, 더 편한 API를 제공합니다.

 

간단한 예제로 시작하기

단일 로우와 컬럼에 여러 그래프 표시하기

두 개의 서로 다른 그래프를 한 로우에 표시하는 예제로 시작해 봅시다. seaborn 라이브러리를 사용하여 더 미적으로 만족스러운 그래프를 그릴 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns

# 샘플 데이터셋 로드
tips = sns.load_dataset("tips")

# 1x2의 서브플롯 생성
fig, axs = plt.subplots(1, 2, figsize=(10, 5))

# 첫 번째 그래프: total_bill의 분포
sns.histplot(tips['total_bill'], kde=True, ax=axs[0])
axs[0].set_title('Total Bill Histogram')

# 두 번째 그래프: tip의 분포
sns.histplot(tips['tip'], kde=True, ax=axs[1], color='orange')
axs[1].set_title('Tip Histogram')

plt.tight_layout()
plt.show()

위 예제에서는 seaborn의 histplot을 이용하여 두 개의 히스토그램을 그립니다. 각 그래프는 axs 배열의 적절한 인덱스를 사용하여 해당 위치에 배치합니다. figsize를 설정하여 전체 Figure의 크기를 조절하고, plt.tight_layout()을 호출하여 그래프들 사이에 적절한 간격을 조정합니다.

subplots의 이러한 기본 사용법을 통해, 데이터 분석 결과를 시각화할 때 여러 그래프를 효율적으로 배열하고 비교하는 것이 가능해집니다.


다중 로우와 컬럼을 활용하여 복잡한 그래프 레이아웃을 만들고, 이를 조정하는 방법과 여러 종류의 그래프를 결합하는 방법에 대해 알아보겠습니다. 이 과정에서 matplotlib와 seaborn 라이브러리를 활용합니다.

 

다중 로우와 컬럼을 활용한 레이아웃

matplotlib과 seaborn을 사용하여 다중 로우와 컬럼으로 구성된 복잡한 레이아웃의 그래프를 만들 수 있습니다. plt.subplots() 함수를 사용하면, 여러 개의 축(ax)을 생성하여 각각에 다양한 그래프를 표시할 수 있습니다.

예를 들어, 2x2 그리드로 구성된 레이아웃을 만들고자 한다면, 다음과 같이 코드를 작성할 수 있습니다:

import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 로드
tips = sns.load_dataset('tips')

# 2x2 레이아웃 설정
fig, axes = plt.subplots(2, 2, figsize=(10, 8))

# 첫 번째 그래프 (상단 좌측)
sns.barplot(x='day', y='total_bill', data=tips, ax=axes[0, 0])

# 두 번째 그래프 (상단 우측)
sns.boxplot(x='day', y='total_bill', data=tips, ax=axes[0, 1])

# 세 번째 그래프 (하단 좌측)
sns.histplot(tips['total_bill'], kde=True, ax=axes[1, 0])

# 네 번째 그래프 (하단 우측)
sns.scatterplot(x='total_bill', y='tip', data=tips, ax=axes[1, 1])

plt.tight_layout()
plt.show()
 

Subplots 조정하기

공간 조정하기(spacing)

plt.subplots_adjust() 함수를 사용하면, subplots 간의 공간을 조정할 수 있습니다. 예를 들어, subplots 사이의 너비와 높이 간격을 조정하려면 다음과 같이 코드를 추가할 수 있습니다:

plt.subplots_adjust(wspace=0.3, hspace=0.3)

여기서 wspace는 너비 간격을, hspace는 높이 간격을 조정합니다.

축 공유하기(sharex, sharey)

여러 그래프에서 x축이나 y축을 공유하게 만들어 데이터 비교를 용이하게 할 수 있습니다. plt.subplots() 함수에서 sharex=True 또는 sharey=True 옵션을 설정합니다.

fig, axes = plt.subplots(2, 2, sharex='col', sharey='row', figsize=(10, 8))
 

Subplots 내에 다른 종류의 그래프 결합하기

하나의 축(ax) 내에 여러 종류의 그래프를 결합할 수 있습니다. 예를 들어, bar plot에 line plot을 겹쳐서 표시하는 경우, 먼저 bar plot을 그린 후 line plot을 추가합니다.

# 축 설정
fig, ax = plt.subplots()

# 가장 많은 팁을 받은 요일별로 정렬
tips_sum_day = tips.groupby('day').sum().reset_index()

# bar plot
sns.barplot(x='day', y='total_bill', data=tips_sum_day, ax=ax, color='lightblue')

# line plot
ax2 = ax.twinx()
sns.lineplot(x='day', y='tip', data=tips_sum_day, ax=ax2, color='black', marker='o')

plt.show()

이 예제에서 twinx() 함수를 사용해 두 번째 y축을 생성하였습니다. 이를 통해 서로 다른 단위를 가진 데이터도 하나의 그래프에 표현할 수 있습니다.

이처럼 matplotlib와 seaborn을 사용하여 다양한 데이터 시각화 기법을 통해 복잡한 데이터를 이해하기 쉽게 표현할 수 있습니다.


 

특수한 레이아웃 다루기

데이터 시각화에서 이해와 통찰을 극대화하기 위해서는 데이터의 표현 방식이 중요합니다. 때로는 여러 그래프를 조합하거나 특별한 레이아웃을 구성해야 할 필요가 있습니다. 이 섹션에서는 matplotlib과 함께 seaborn를 사용하여 고급 및 비정형 레이아웃을 만드는 방법을 다룹니다.

 

GridSpec을 사용한 고급 레이아웃 구성

GridSpec의 기본

GridSpec은 matplotlib에서 그래프 레이아웃을 세밀하게 제어할 수 있는 강력한 도구입니다. 각 subplot 사이의 공간, 크기, 위치 등을 정밀하게 조정할 수 있게 해줍니다.

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

# GridSpec 객체 생성
gs = GridSpec(3, 3) # 3x3 격자

# 3개의 서로 다른 크기와 위치에 subplot 생성하기
ax1 = plt.subplot(gs[0, :])  # 첫 번째 row, 모든 column
ax2 = plt.subplot(gs[1, :-1])  # 두 번째 row, 첫 번째와 두 번째 column
ax3 = plt.subplot(gs[1:, 2])  # 두 번째 row부터 마지막 row까지, 마지막 column
ax4 = plt.subplot(gs[-1, 0])  # 마지막 row, 첫 번째 column
ax5 = plt.subplot(gs[-1, -2])  # 마지막 row, 두 번째 column

plt.tight_layout()
plt.show()

GridSpec을 통한 복잡한 레이아웃 예시

다양한 크기와 위치의 subplots를 생성하여 복잡한 레이아웃을 구성할 수 있습니다. 예시에서 본 것처럼 GridSpec는 매우 유연합니다.

 

비정형 레이아웃 생성

inset_axes를 사용한 차트 내 차트

inset_axes를 사용하면 주요 plot 내에 추가적인 plot을 삽입할 수 있습니다. 이 방법은 세부적인 정보를 제공하거나 데이터의 특정 부분에 대해 강조하고자 할 때 유용합니다.

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

# 메인 차트 생성
fig, ax = plt.subplots()
ax.plot(range(10), range(10))

# 메인 차트 내에 부차적인 차트 생성
ax_inset = inset_axes(ax, width="20%", height="20%", loc="upper left")
ax_inset.plot(range(10), range(10)[::-1])  # 역순 데이터 삽입

plt.show()

이 경우, inset_axes의 위치와 크기는 메인 차트에 비례하여 설정되므로, 메인 차트의 일부분에 대해 추가적인 정보를 제공하는 차트를 편리하게 추가할 수 있습니다.

위 예제들을 통해, matplotlib와 seaborn을 사용하여 다양하고 복잡한 데이터 시각화 레이아웃을 구성할 수 있는 방법들을 소개했습니다. 데이터 시각화 프로젝트에서 이러한 기법들을 활용하면, 데이터 분석 결과를 보다 효과적으로 전달할 수 있을 것입니다.

Previous
matplotlib의 스타일링