Figure
Matplotlib는 data를 Figure(e.g. windows, Jupyter widgets, etc.)에 x-y 좌표의 그래프로 표시합니다(3차원은 x-y-z, 극좌표는 세타-r 등). 각각의 Figure는 하나 이상의 Axes를 갖습니다. 가장 간단하게 Figure, Axes 객체를 만드는 방법은 pyplot.subplots()을 사용하는
것입니다. 그 후 Axes.plot()를 활용하여 Axes에 데이터를 그립니다.
fig, ax = plt.subplots()
ax.plot([1,2,3,4], [1,4,2,3]);
Figure는 전체 그림(그래프)을 의미하는 객체입니다. Figure 객체는 Axes, 특수 Artist 그룹(title, figure legends, colorbar, etc), 그리고 심지어 중첩된 subfigures까지 포함할 수 있습니다.
가장 쉬운 방법으로 Figure 객체를 생성하는 방법들입니다. Axes 없이 Figure만 얻으려면 figure() 메서드를 사용하면 됩니다. 1개의 Axes 객체를 갖는 Figure를 만들기 위해선 subplots() 메서드를 인수 없이 사용하면 됩니다.
grid 형태의 shape을 갖는 Axes 객체를 여럿 만들 땐 subplot() 메서드에 첫 인수로 row를 두 번째 인수로 column을 입력합니다.
fig = plt.figure # an empty figure with no Axes
fig, ax = plt.subplots() # a figure with a sing Axes
fig, axs = plt.subplots(2, 2) # a figure with a 2 x 2 grid of Axes
Figure - plt.plot()
원래 Figure 객체를 생성하려면 figure()을 사용하여 그 반환값으로 Figure 객체를 얻어야 합니다.
그러나 plot() 명령만 실행해도 자동으로 Figure 객체를 생성해주기 때문에 일반적으로는 figure()를 잘 사용하지 않습니다
figure()을 명시적으로 사용하는 경우는 여러 개의 Windows를 동시에 띄워야 하거나 (non-interactive python), Jupyter lab 등에서(ipython) 그림의 크기를 설정하고 싶을 때 사용합니다. 그림의 크기는 figsize 인수로 설정합니다.
np.random.seed(0)
f1 = plt.figure(figsize = (10, 2))
plt.title("figure size : (10, 2)")
plt.plot(np.random.randn(100))
plt.show()
Figure - Figure 객체 얻기 plt.gcf()
현재 사용하고 있는 Figure 객체를 얻으려면(다른 변수에 할당할 수도 있습니다.) gcf() 메서드를 사용합니다.
f1 = plt.figure(1)
plt.title("현재의 Figure 객체")
plt.plot([1,2,3,4], 'ro:')
f2 = plt.gcf()
print(f1, id(f1))
print(f2, id(f2))
plt.show()
Axes
Figure 객체 안에 여러개의 플롯을 그리드(grid) 형태로 보여야하는 경우도 있습니다.
Figure 안에 있는 각각의 플롯은 Axes라고 불리는 객체에 속합니다.
Figure 안에 Axes를 생성하려면 원래 subplot()을 사용하여 명시적으로 Axes 객체를 얻어야합니다.
그러나 plot()을 바로 사용해도 자동으로 Figure, Axes 객체를 생성해줍니다.
subplot()은 그리드(grid) 형태의 Axes 객체들을 생성합니다. Figure가 행렬(matrix)이고 Axes가 행렬의 원소라고 생각하면 됩니다.
예를 들어 위와 아래 두 개의 플롯이 있는 경우 행이 2 이고 열이 1인 2x1 행렬입니다.
subplot 명령은 세개의 인수를 가지는데 처음 두개의 원소가 전체 그리드 행렬의 모양을 지시하는 두 숫자이고 세번째 인수가 네 개 중 어느것인지를 의미하는 숫자가 됩니다.
ax1 = plt.subplot(2,1,1)
# 여기에서 윗 부분에 그릴 플롯 명령 실행
ax2 = plt.subplot(2,1,2)
# 여기에서 아랫부분에 그릴 플롯 명령 실행
위/아래 두 개의 플롯을 하나의 Figure 안에 그리려면 다음처럼 명령을 실행해야 합니다. 여기에서 숫자 인덱싱은 파이썬이 아닌 Matlab 관행을 따르기 때문에 첫번째 플롯을 가리키는 숫자가 0이 아니라 1임에 주의해야 합니다.
tight_layout() 명령을 실행하면 플롯 간의 간격을 자동으로 맞춰줍니다.
x1 = np.linspace(0.0, 5.0)
x2 = np.linspace(0.0, 2.0)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
y2 = np.cos(2 * np.pi * x2)
ax1 = plt.subplot(2,1,1)
plt.plot(x1, y1, 'yo-')
plt.title('A tale of 2 subplots')
plt.ylabel('Damped oscillation')
ax2 = plt.subplot(2,1,2)
plt.plot(x2, y2, 'r.-')
plt.xlabel('time (s)')
plt.ylabel('Undamped')
plt.tight_layout()
plt.show()
만약 2x2 형태의 네 개의 플롯이라면 다음과 같이 그립니다. 이 때 subplot 의 인수는 (2,2,1)를 줄여서 221 라는 하나의 숫자로 표시할 수도 있습니다. Axes의 순서는 콘솔 출력 순서와 동일합니다(좌에서 우로, 위에서 아래로).
np.random.seed(0)
plt.subplot(221)
plt.plot(np.random.rand(5))
plt.title('axes 1')
plt.subplot(222)
plt.plot(np.random.rand(5))
plt.title('axes 2')
plt.subplot(223)
plt.plot(np.random.rand(5))
plt.title('axes 3')
plt.subplot(224)
plt.plot(np.random.rand(5))
plt.title('axes 4')
plt.tight_layout()
plt.show()
subplots()에 인수를 두개만 전달하면 복수의 Axes 객체를 동시에 생성할 수도 있습니다. 이때는 2차원 ndarray 형태로 Axes 객체가 반환됩니다.
fig, axes = plt.subplots(2, 2)
np.random.seed(0)
axes[0, 0].plot(np.random.rand(5))
axes[0, 0].set_title('axes 1')
axes[0, 1].plot(np.random.rand(5))
axes[0, 1].set_title('axes 1')
axes[1, 0].plot(np.random.rand(5))
axes[1, 0].set_title('axes 1')
axes[1, 1].plot(np.random.rand(5))
axes[1, 1].set_title('axes 1')
plt.tight_layout()
plt.show()
Axes는 데이터 플로팅을 위한 영역으로 Figure에 포함되는 Artist입니다. 일반적으로 2차원의 경우 Axis 객체를 두 개 포함합니다.(3차원의 경우 Axis 객체를 세 개 포함)
Axis는 ticks와 tick labels을 제공하며 이는 Axes의 데이터 범위에 대한 척도가 됩니다.
- Axes와 Axis는 다른 객체이므로 잘 구분해서 봐야 합니다.
Axes 클래스와 그 메서드는 주요한 Entry point이며, 대부분의 플로팅 메서드가 정의되어 있습니다.
Axis
- 하나의 Axes 객체는 두 개 이상의 Axis 객체를 가집니다. Axis 객체는 플롯의 가로축이나 세로축을 나타내는 객체입니다.
- Axis 객체는 ticks(축의 표시)과 ticklabels(눈금 레이블을 지정하는 문자열)에 대한 규모와 제한을 설정합니다.
- ticks의 위치는 Locator 객체에 의해 결정되며, 눈금 레이블 문자열은 Formatter 객체에 의해 형식이 지정됩니다.
- Locator와 Formatter 객체를 올바르게 조합하면 매우 세밀하게 tick 위치와 labels을 제어할 수 있습니다.
여러가지 플롯을 하나의 Axes 객체에 표시할 때 y값의 크기가 달라서 표시하기 힘든 경우가 있습니다. 이 때는 다음처럼 twinx 명령으로 대해 복수의 y 축을 가진 플롯을 만들수도 있습니다. twinx 명령은 x 축을 공유하는 새로운 Axes 객체를 만듭니다.
fig, ax0 = plt.subplots()
ax1 = ax0.twinx()
ax0.set_title('2개의 축 한 figure에서 사용하기')
ax0.plot([10,5,2,9,7], 'r-', label = 'y0')
ax0.set_ylabel('y0')
ax0.grid(False)
ax1.plot([100,200,220, 180, 120], 'g:', label = 'y1')
ax1.set_ylabel('y1')
ax1.grid(False)
ax0.set_xlabel('공유되는 x축')
plt.show()
Artist
기본적으로 Figure에 보이는 모든 것들을 Artist라고 합니다. 이는 Figure, Axes, Axis 객체도 포함됩니다.
또 Text 객체, Line2D 객체, collections 객체, Patch 객체 등도 포함됩니다.
Figure가 렌더링될 때, 모든 Artists가 그려집니다. 대부분의 Artists는 하나의 Axes에 묶여 있습니다.
이러한 Artists는 여러 Axes에 공유되거나 이동할 수 없습니다.
'데이터 분석 및 시각화 > 데이터 시각화' 카테고리의 다른 글
[Python] Seaborn(barplot, boxplot, violinplot) (0) | 2023.01.27 |
---|---|
[Python] Seaborn(style 세팅, 카운트 플롯, 히스토그램(displot)) (0) | 2023.01.26 |
[Python] matplotlib - 차트 (0) | 2023.01.26 |
[Python] Matplotlib - 폰트 설정법 (0) | 2023.01.26 |
[Python] Matplotlib - 기초(style, 범례, label) (0) | 2023.01.25 |