본문 바로가기
Python/matplotlib

[matplotlib] 계층구조 및 Container : Figure, Axes, Axis

by ds31x 2023. 7. 14.

matplotlib의 계층구조

matplotlib는 다음과 같은 hierarchical structure를 가지고 있음.

  • 일반적으로 Figure는 하나 이상의 Axes를 가지며(포함하며),
    Axes는 일반적으로 2개의 Axis 를 포함(2D image인 경우)함.
    (Axis들은 Tick을 포함)
  • matplotlib에서 그려지는 모든 objectArtist 임.
  • Figure, Axes, Axis 는 모두 Artist 이면서 container 임.
  • 하나의 그래프(or chart)에는 하나의 figure만이 존재함.

다음 그림은
이들의 hierarchical structure와
해당 구조의 Artist들(or container들)이 실제 그래프에서 어디에 속하는지를 보여줌.

right : https://dev.to/skotaro/artist-in-matplotlib---something-i-wanted-to-know-before-spending-tremendous-hours-on-googling-how-tos--31oo, left : https://matplotlib.org/1.5.1/faq/usage_faq.html#parts-of-a-figure


다음 예제 code는

각 계층에 속하는 object들이

자신을 포함하고 있는 object와 자신이 포함한 object를 어떻게 접근하는지를 보여줌.

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1) # make a blank plotting area
# fig, ax = plt.subplots()  # ax를 포함하고 있는 fig를 반환. 위의 두 line을 한번에 처리.

print('fig.axes:', fig.axes)   # fig.axes는 list임. (Figure는 복수 개의 Axes를 가질 수 있음)
print('ax.figure:', ax.figure) # ax 는 Axes의 instance임.
print('ax.xaxis:', ax.xaxis)
print('ax.yaxis:', ax.yaxis)
print('ax.xaxis.axes:', ax.xaxis.axes)
print('ax.yaxis.axes:', ax.yaxis.axes)
print('ax.xaxis.figure:', ax.xaxis.figure)
print('ax.yaxis.figure:', ax.yaxis.figure)

Artist

matplotlib에서 그려지는 모든 object를 Artist 라고 지칭함.

  • Figure, Axes, Axis, Tick 모두 Artist들임.
  • Artist들의 root는 Figure이며, 해당하는 그림(figure)가 canvas에 rendering됨.
  • 일반적으로 다루어지는 Artist들은 하나의 Axes에 속함.

다음 그림은 각 Artist들이 어떻게 차트(figure)를 구성하는지를 보여줌.

Artists는 크게 다음의 두가지 type으로 나뉨: Container, Primitive

  • Container자신보다 아래 단계의 container 또는 primitive를 포함할 수 있음 (일종의 Artist들이 포함될 수 있는 box라고 생각할 수 있음).
  • Primitive는 실제로 그려지는 차트의 종류나 annotation, legend 등에 해당하는 Artist들임.


Containers

1. Figure

결과물로 그려지는 figure 하나가 바로 Figureclass의 객체에 해당.

  • Figure는 자신이 포함하고 있는 Axes들을 child Axes라고 부르며, 이들을 관리함 (다수의 Axes instances를 가질 수 있음.)
  • title, figure legend, colorbar 등의 Artist들도 관리함.
# figure를 생성하고 axes를 추가.
fig = plt.figure()
ax = fig.add_subplot(1,1,1) # make a blank plotting area

# 일반적으로는 아래처럼 Axes의 객체 ax와 Figure 객체 fig를 한번에 생성시킴.
fig, ax  = plt.subplots()      # a figure with a single Axes
fig, axs = plt.subplots(2, 2)  # a figure with a 2x2 grid of Axes. 
                               # axs는 여러 Axes 객체로 구성된 collection.

# a figure with one axes on the left, and two on the right:
fig, axs = plt.subplot_mosaic([['left', 'right_top'],
                               ['left', 'right_bottom']])

2.Axes 

AxesFigure에 부착되는 Artist이며,

전체 figure canvas에서 실제 data가 그려지는 영역을 할당받고

해당 영역에 대한 coordinate system을 제공 하는 Class임.

  • 일반적으로 2개의 Axis를 포함하고 있음. (2D graph의 경우임. 3D인 경우 3개 포함)
  • set_title()통해 title을 설정할 수 있고, set_xlabel(), set_ylabel()을 통해 각 Axis의 label을 설정할 수 있음.
  • OOP interface를 차트를 그리는 경우 가장 많이 이용되는 entry point이기 때문에 다양한 plot 관련 메소드를 가짐.

The matplotlib.axes.Axes is the center of the matplotlib universe.
실제로 Figure의 인스턴스와 Axes의 인스턴스를 동시에 생성하고 난 이후에는,
Axes 인스턴스를 통해 graph의 그리게 된다. 

즉, Primitives들의 사용은 거의 대부분 Axes object의 대응하는 메서드 (helper methods)를 통해 이루어짐.

 

다음은 Axes의 attribute들에 대한 표이다.

Attribute Desc.
Axes.artists Axes 객체에 속한 Artist object들의 list
Axes.patch Axes의 background를 위한 Rectangle object
Axes.collections AxesCollection object들의 list
Axes.images AxesAxesImage object들의 list
Axes.legends AxesLegend object들의 list
Axes.lines AxesLine2D object들의 list
Axes.patches AxesPatch object들의 list
Axes.texts AxesText object들의 list
Axes.xaxis matplotlib.axis.XAxis object
Axes.yaxis matplotlib.axis.YAxis object

 

다음은 Axes에서 많이 이용되는 helper method들과 관련 Artist class들, 그리고 Axes의 attribute들의 관계를 나타낸 표이다.

Helper methods Artist Axes's attribute
ax.annotate Annotate Axes.texts
ax.bar Rectangle Axes.patches
ax.errorbar Line2D and Rectangle Axes.lines and Axes.patches
ax.fill Polygon Axes.patches
ax.hist Rectangle Axes.patches
ax.imshow AxesImage Axes.images
ax.legend Legend Axes.legends
ax.plot Line2D Axes.lines
ax.scatter PathCollection Axes.collections
ax.text Text Axes.texts

3. Axis

축의 scale과 limit을 설정하고 tick과 ticklabel들을 생성하는데 사용되는 class.

  • tick의 위치는 Locator에 의해서 결정되며, ticklabel의 문자열은 Formatter로 조절됨.
  • Axesset_xlabel, set_ylabel을 통해 Axis의 label을 설정하는 것도 가능함 (실제 구현은 Axis의 대응하는 메서드가 호출되어 이루어짐.).
Attributes Desc.
Axis.label Axis의 label에 해당하는 Text object
Axis.majorTicks major tick 을 위한 list
Axis.minorTicks minor tick 을 위한 list

다음 code는 Axis의 attribute들을 확인해보는 방법을 보여줌.

xax = ax.xaxis
print('xax.label:', xax.label)
print('xax.majorTicks:\n', xax.majorTicks) # seven major ticks (from 0 to 6) and two invisible ticks locating outside of the figure
print('xax.minorTicks:\n', xax.minorTicks) # two ticks outside the figure

더 읽어보면 좋은 자료

https://matplotlib.org/stable/tutorials/introductory/quick_start.html

 

Quick start guide — Matplotlib 3.7.2 documentation

Axes labels and text set_xlabel, set_ylabel, and set_title are used to add text in the indicated locations (see Text in Matplotlib Plots for more discussion). Text can also be directly added to plots using text: mu, sigma = 115, 15 x = mu + sigma * np.rand

matplotlib.org

 

https://dev.to/skotaro/artist-in-matplotlib---something-i-wanted-to-know-before-spending-tremendous-hours-on-googling-how-tos--31oo

 

"Artist" in Matplotlib - something I wanted to know before spending tremendous hours on googling how-tos.

Things to know before diving into Stack Overflow answers.

dev.to

 

https://gist.github.com/dsaint31x/bb5720ccf170b52fa9a5cc38d4ac92b7

 

py_matplot_hierarchy_container.ipynb

py_matplot_hierarchy_container.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com