[데이터 시각화 소개] 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을 사용하여 다양하고 복잡한 데이터 시각화 레이아웃을 구성할 수 있는 방법들을 소개했습니다. 데이터 시각화 프로젝트에서 이러한 기법들을 활용하면, 데이터 분석 결과를 보다 효과적으로 전달할 수 있을 것입니다.