0Pricing
Pandas & NumPy Academy · 강의

Figure와 Axes 구조

Figure-Axes-Artist 계층을 이해하고 plt.subplots()로 그래프를 만들며 상태 비저장 API와 객체 지향 API를 구분합니다.

Figure와 Axes 구조은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Matplotlib 구조를 배우는 이유

Pandas와 Seaborn은 내부적으로 Matplotlib을 사용합니다. Matplotlib의 객체 계층 구조를 이해하면 전체 캔버스부터 개별 눈금까지 그래프의 모든 요소를 제어할 수 있고, 하나의 Figure에 여러 차트를 결합할 수도 있습니다. Figure-Axes 모델을 이해하지 못하면 어떤 함수를 호출해야 할지 추측하느라 그래프를 사용자 지정하는 일이 곧 답답한 작업이 됩니다.

Figure: 캔버스

Figure는 가장 바깥쪽 컨테이너로, 전체 창이나 이미지 파일을 의미합니다. 하나 이상의 Axes 객체(실제 그래프 영역)와 제목, 공유 범례, 여백을 포함합니다. plt.figure()를 사용하거나 plt.subplots()를 통해 암묵적으로 Figure를 만들 수 있습니다. Figure에 설정하는 대부분의 속성은 크기, 배경색, 전체 제목처럼 캔버스 전체에 영향을 줍니다.

import matplotlib.pyplot as plt
import numpy as np

# Create a Figure with a specific size
fig = plt.figure(figsize=(8, 4))  # width=8 inches, height=4 inches
print(type(fig))  # matplotlib.figure.Figure
print('Figure size:', fig.get_size_inches())
plt.close()  # close to avoid display in scripts

Axes: 그래프가 그려지는 곳

Axes 객체는 Figure 안의 하나의 그래프 영역입니다. x축, y축, 눈금, 격자선 및 모든 시각적 요소(선, 막대, 산점도)를 포함합니다. 대부분의 그래프 그리기 호출은 Axes 객체의 메서드입니다: ax.plot(), ax.bar(), ax.scatter(). 하나의 Figure에는 여러 Axes가 포함될 수 있으며, 서브플롯 격자 형태로 배치됩니다.

fig, ax = plt.subplots()  # Creates Figure + one Axes
print(type(ax))  # matplotlib.axes.Axes

x = np.linspace(0, 10, 100)
ax.plot(x, np.sin(x))  # plot on the Axes
plt.tight_layout()
# plt.show()
plt.close()

plt.subplots(): Figure와 Axes를 함께 만들기

plt.subplots(nrows, ncols)는 격자 레이아웃으로 하나 이상의 Axes를 포함하는 Figure를 만드는 데 권장되는 방법입니다. 이 함수는 (fig, ax) 튜플을 반환하며, 서브플롯이 여러 개이면 (fig, axes_array)를 반환합니다. figsize 매개변수는 전체 캔버스 크기를 인치 단위로 설정합니다. 명확성을 위해 항상 반환 결과를 이름이 있는 변수에 풀어 할당하세요.

# Single plot
fig, ax = plt.subplots(figsize=(6, 4))

# 2 rows, 1 column
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 8))

# 2 rows, 2 columns
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
ax_top_left = axes[0, 0]
ax_top_right = axes[0, 1]
print('axes shape:', axes.shape)  # (2, 2)
plt.close('all')

객체 지향 API와 상태 기반 API

Matplotlib에는 두 가지 사용 방식이 있습니다. 상태 기반(pyplot) API는 plt.plot(), plt.xlabel() 등을 사용하며 현재 Axes에 적용됩니다. 따라서 빠른 대화형 탐색에 편리합니다. 객체 지향(OO) API는 ax 객체에서 메서드를 명시적으로 호출합니다: ax.plot(), ax.set_xlabel(). 어떤 Axes가 수정되는지 명확하므로 운영 코드와 여러 패널로 구성된 Figure에는 OO API를 강력히 권장합니다.

x = [1, 2, 3, 4]
y = [1, 4, 9, 16]

# Stateful API (convenient but fragile)
# plt.plot(x, y)
# plt.xlabel('x')
# plt.title('Squares')

# Object-oriented API (preferred)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('x')
ax.set_title('Squares')
plt.close()

Artist: 그래프를 구성하는 기본 요소

Matplotlib 플롯에서 눈에 보이는 모든 요소는 아티스트입니다. Figure, Axes, 선, 텍스트, 패치(막대에 해당하는 직사각형), 마커가 모두 여기에 포함됩니다. Figure-Axes-Artist 계층 구조는 가장 바깥쪽 컨테이너에서 가장 작은 시각적 요소까지 이어집니다. 이 계층 구조를 이해하면 프로그래밍 방식으로 어떤 요소든 찾아 수정할 수 있습니다. 예를 들어 차트를 그린 후 특정 막대의 색을 변경할 수 있습니다.

fig, ax = plt.subplots()
line, = ax.plot([1, 2, 3], [1, 4, 9], color='blue', linewidth=2)

# Introspect the hierarchy
print('Figure:', type(fig))
print('Axes:', type(ax))
print('Line Artist:', type(line))
print('Line color:', line.get_color())
plt.close()

축 객체: XAxis와 YAxis

각 Axes에는 두 개의 Axis 객체가 포함됩니다(Axes와 혼동하지 마십시오): ax.xaxis와 ax.yaxis입니다. 이 객체들은 눈금, 눈금 레이블, 스파인(눈에 보이는 선)을 제어합니다. ax.set_xlim()과 ax.set_ylim()으로 축의 범위를 설정하고, ax.set_xticks()로 눈금 간격을 조정하며, ax.xaxis.set_major_formatter()로 레이블 형식을 지정할 수 있습니다.

fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 40, 30, 70])

ax.set_xlim(0, 5)
ax.set_ylim(0, 80)
ax.set_xticks([1, 2, 3, 4])
ax.set_xticklabels(['Q1', 'Q2', 'Q3', 'Q4'])
ax.set_xlabel('Quarter')
ax.set_ylabel('Revenue')
plt.close()

여러 패널 플롯에서 축 공유하기

서브플롯 격자를 만들 때 plt.subplots()에 sharex=True 또는 sharey=True를 전달하면 패널 간 축 배율을 연결할 수 있습니다. 이렇게 하면 한 서브플롯을 확대하거나 이동할 때 해당 축을 공유하는 모든 패널이 자동으로 업데이트됩니다. 이는 여러 그룹의 시계열을 비교할 때 특히 중요합니다. 모든 패널에 동일한 x축 범위를 표시해야 하기 때문입니다.

import numpy as np

x = np.arange(10)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(6, 5))

ax1.plot(x, x**2, color='blue')
ax1.set_title('Squares')

ax2.plot(x, x**3, color='red')
ax2.set_title('Cubes')

fig.suptitle('Powers of x')  # shared figure title
plt.tight_layout()
plt.close()

tight_layout()으로 간격 조정하기

plt.tight_layout()(또는 fig.tight_layout())은 레이블, 제목, 눈금 표시가 서로 겹치는 것을 최소화하도록 서브플롯 매개변수를 자동으로 조정합니다. plt.show() 또는 fig.savefig()를 호출하기 직전에 사용하십시오. 세밀하게 조정하려면 plt.subplots_adjust(hspace=, wspace=)를 사용해 서브플롯 사이의 세로 및 가로 간격을 직접 설정할 수 있습니다.

fig, axes = plt.subplots(2, 2, figsize=(10, 8))

for i, ax in enumerate(axes.flat):
    ax.plot([1, 2, 3], [i, i+1, i+2])
    ax.set_title(f'Panel {i+1}')
    ax.set_xlabel('x axis label')
    ax.set_ylabel('y axis label')

fig.suptitle('Grid of Plots', y=1.02)
plt.tight_layout()  # prevents overlapping labels
plt.close()

subplots()에서 Axes에 접근하기

plt.subplots(nrows, ncols)가 여러 axes를 반환하면, 이 객체들은 (nrows, ncols) 형태의 NumPy 배열에 담깁니다. 2차원 배열과 같은 방식으로 인덱싱할 수 있습니다. 예를 들어 axes[0, 1]은 첫 번째 행, 두 번째 열을 가리킵니다. axes.flat을 사용하면 격자 형태와 관계없이 행 우선 순서로 모든 axes를 순회할 수 있어, 모든 패널에 동일한 서식을 적용할 때 매우 편리합니다.

fig, axes = plt.subplots(2, 3, figsize=(12, 6))

# Access by row, column
axes[0, 0].set_title('Top Left')
axes[1, 2].set_title('Bottom Right')

# Iterate over all axes
for ax in axes.flat:
    ax.set_xlabel('Time')
    ax.set_ylabel('Value')

plt.tight_layout()
plt.close()

사용하지 않는 Axes 제거하기

서브플롯 격자를 만들었지만 모든 패널을 사용하지 않으면 빈 axes에도 테두리가 표시됩니다. ax.set_visible(False) 또는 fig.delaxes(ax)를 호출해 사용하지 않는 axes를 숨기거나 제거하십시오. 흔히 axes.flat을 순회하면서 그리는 데이터 계열 수를 초과하는 모든 패널을 숨겨 그림을 깔끔하게 정리합니다.

fig, axes = plt.subplots(2, 3, figsize=(12, 6))
data_panels = 4  # only 4 plots needed in a 2x3 grid

for i, ax in enumerate(axes.flat):
    if i < data_panels:
        ax.plot([1, 2, 3], [i, i+1, i+2])
        ax.set_title(f'Panel {i+1}')
    else:
        ax.set_visible(False)  # hide extra panels

plt.tight_layout()
plt.close()

빠른 확인

이 과에서 배운 Matplotlib의 Figure 및 Axes 구조에 대한 이해도를 확인해 보십시오.

과정 요약

이 과에서는 다음을 배웠습니다. Figure는 전체 캔버스이고 Axes는 그 안에 있는 하나의 플롯 영역입니다. plt.subplots()는 두 객체를 함께 만들고 (fig, ax)를 반환합니다. 객체 지향 API(ax.plot(), ax.set_xlabel())는 상태를 사용하는 pyplot API보다 권장됩니다. 또한 tight_layout()은 여러 패널로 구성된 Figure에서 레이블이 겹치는 것을 방지합니다. 다음 과에서는 스타일을 완전히 제어하면서 선 플롯과 산점도를 만들어 보겠습니다.

자주 묻는 질문

“Figure와 Axes 구조” 강의는 무료인가요?

네 — “Figure와 Axes 구조” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Figure와 Axes 구조”에서 뭘 배우나요?

Figure-Axes-Artist 계층을 이해하고 plt.subplots()로 그래프를 만들며 상태 비저장 API와 객체 지향 API를 구분합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“Figure와 Axes 구조” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Figure와 Axes 구조
  2. 선 그래프와 산점도
  3. 막대 그래프와 히스토그램
  4. 레이블, 제목, 그림 저장
← Pandas & NumPy Academy(으)로 돌아가기