Matplotlib 박스 종횡비

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Matplotlib 의 set_box_aspect() 메서드를 사용하여 다양한 플롯을 생성하는 과정을 안내합니다. 이 메서드는 데이터 제한과 관계없이 물리적 단위로 축 높이와 너비 간의 종횡비를 설정합니다. 이는 포함된 데이터와 관계없이 정사각형 플롯을 생성하거나, 고정된 (데이터) 종횡비를 가진 이미지 플롯 옆에 동일한 축 치수를 가진 일반적인 플롯을 갖는 데 유용합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 즉시 문제를 해결해 드리겠습니다.

데이터와 무관한 정사각형 축

데이터 제한에 관계없이 정사각형 축을 생성합니다.

import matplotlib.pyplot as plt
import numpy as np

fig1, ax = plt.subplots()

ax.set_xlim(300, 400)
ax.set_box_aspect(1)

plt.show()

공유된 정사각형 축

크기가 정사각형인 공유된 서브플롯을 생성합니다.

fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)

ax.plot([1, 5], [0, 10])
ax2.plot([100, 500], [10, 15])

ax.set_box_aspect(1)
ax2.set_box_aspect(1)

plt.show()

정사각형 트윈 축 (Twin Axes)

트윈 축이 있는 정사각형 축을 생성합니다. 트윈 축은 부모의 박스 종횡비 (box aspect) 를 상속받습니다.

fig3, ax = plt.subplots()

ax2 = ax.twinx()

ax.plot([0, 10])
ax2.plot([12, 10])

ax.set_box_aspect(1)

plt.show()

이미지 옆의 일반 플롯

고정된 데이터 종횡비 (data aspect) 와 기본 adjustable="box"를 사용하여 일반 플롯 옆에 이미지 플롯을 생성할 때, 축의 높이가 서로 다르게 됩니다. set_box_aspect()는 일반 플롯의 축이 이미지의 차원을 박스 종횡비로 사용하도록 허용하여 이에 대한 쉬운 해결책을 제공합니다. 이 예제는 또한 constrained layout이 고정된 박스 종횡비와 잘 상호 작용한다는 것을 보여줍니다.

fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")

np.random.seed(19680801)  ## Fixing random state for reproducibility
im = np.random.rand(16, 27)
ax.imshow(im)

ax2.plot([23, 45])
ax2.set_box_aspect(im.shape[0]/im.shape[1])

plt.show()

정사각형 결합/주변 분포 플롯

결합 데이터 플롯 옆에 주변 분포를 표시하는 것이 바람직할 수 있습니다. 다음은 주변 축의 박스 종횡비가 gridspec 의 너비 및 높이 비율과 동일한 정사각형 플롯을 생성합니다. 이렇게 하면 그림 크기에 관계없이 모든 축이 완벽하게 정렬됩니다.

fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
                         gridspec_kw=dict(height_ratios=[1, 3],
                                          width_ratios=[3, 1]))
axs[0, 1].set_visible(False)
axs[0, 0].set_box_aspect(1/3)
axs[1, 0].set_box_aspect(1)
axs[1, 1].set_box_aspect(3/1)

np.random.seed(19680801)  ## Fixing random state for reproducibility
x, y = np.random.randn(2, 400) * [[.5], [180]]
axs[1, 0].scatter(x, y)
axs[0, 0].hist(x)
axs[1, 1].hist(y, orientation="horizontal")

plt.show()

여러 서브플롯의 박스 종횡비

초기화 시 Axes 에 박스 종횡비를 전달하는 것이 가능합니다. 다음은 모든 Axes 가 정사각형인 2x3 서브플롯 그리드를 생성합니다.

fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
                         sharex=True, sharey=True, layout="constrained")

for i, ax in enumerate(axs.flat):
    ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
plt.show()

요약

이 랩에서는 Matplotlib 에서 set_box_aspect()를 사용하여 축 높이와 너비 간에 고정된 종횡비를 가진 다양한 유형의 플롯을 만드는 방법에 대한 개요를 제공했습니다.