소개
Matplotlib 는 Python 프로그래밍 언어와 수치 수학 확장 NumPy 를 위한 플로팅 라이브러리입니다. Matplotlib 의 특징 중 하나는 사용자 정의 박스 스타일을 생성하는 기능입니다.
이 Lab 에서는 Matplotlib 에서 사용자 정의 박스 스타일을 구현하는 방법을 배우게 됩니다. 사용자 정의 박스 스타일을 함수와 클래스로 생성하는 방법을 배우고, Matplotlib 에 사용자 정의 박스 스타일을 등록하는 방법도 배우게 됩니다.
VM 팁
VM 시작이 완료되면, 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 접근하십시오.
때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.
학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 신속하게 해결해 드리겠습니다.
함수로 사용자 정의 박스 스타일 구현하기
사용자 정의 박스 스타일은 사각형 박스와 "변형 (mutation)"의 양을 모두 지정하는 인수를 취하고 "변형된 (mutated)" 경로를 반환하는 함수로 구현할 수 있습니다. 여기서는 박스 왼쪽에 "화살표" 모양을 추가하는 새로운 경로를 반환하는 사용자 정의 박스 스타일을 구현합니다.
import matplotlib.pyplot as plt
from matplotlib.patches import BoxStyle
from matplotlib.path import Path
def custom_box_style(x0, y0, width, height, mutation_size):
"""
박스의 위치와 크기가 주어지면, 그 주변의 박스 경로를 반환합니다.
회전은 자동으로 처리됩니다.
Parameters
----------
x0, y0, width, height : float
박스 위치 및 크기.
mutation_size : float
변형 참조 스케일, 일반적으로 텍스트 글꼴 크기.
"""
## 패딩
mypad = 0.3
pad = mutation_size * mypad
## 패딩이 추가된 너비와 높이.
width = width + 2 * pad
height = height + 2 * pad
## 패딩된 박스의 경계
x0, y0 = x0 - pad, y0 - pad
x1, y1 = x0 + width, y0 + height
## 새로운 경로 반환
return Path([(x0, y0),
(x1, y0), (x1, y1), (x0, y1),
(x0-pad, (y0+y1)/2), (x0, y0),
(x0, y0)],
closed=True)
fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
bbox=dict(boxstyle=custom_box_style, alpha=0.2))
plt.show()
클래스로 사용자 정의 박스 스타일 구현하기
사용자 정의 박스 스타일은 __call__을 구현하는 클래스로도 구현할 수 있습니다. 그런 다음 클래스를 BoxStyle._style_list 딕셔너리에 등록할 수 있으며, 이를 통해 문자열로 박스 스타일을 지정할 수 있습니다. bbox=dict(boxstyle="registered_name,param=value,...", ...).
class MyStyle:
"""A simple box."""
def __init__(self, pad=0.3):
"""
인수는 float 여야 하며 기본값을 가져야 합니다.
Parameters
----------
pad : float
패딩 양
"""
self.pad = pad
super().__init__()
def __call__(self, x0, y0, width, height, mutation_size):
"""
박스의 위치와 크기가 주어지면, 그 주변의 박스 경로를 반환합니다.
회전은 자동으로 처리됩니다.
Parameters
----------
x0, y0, width, height : float
박스 위치 및 크기.
mutation_size : float
변형에 대한 참조 스케일, 일반적으로 텍스트 글꼴 크기.
"""
## 패딩
pad = mutation_size * self.pad
## 패딩이 추가된 너비와 높이
width = width + 2.*pad
height = height + 2.*pad
## 패딩된 박스의 경계
x0, y0 = x0 - pad, y0 - pad
x1, y1 = x0 + width, y0 + height
## 새로운 경로 반환
return Path([(x0, y0),
(x1, y0), (x1, y1), (x0, y1),
(x0-pad, (y0+y1)/2.), (x0, y0),
(x0, y0)],
closed=True)
BoxStyle._style_list["angled"] = MyStyle ## 사용자 정의 스타일 등록.
fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))
del BoxStyle._style_list["angled"] ## 등록 해제.
plt.show()
Matplotlib 에 사용자 정의 박스 스타일 등록하기
클래스로 사용자 정의 박스 스타일을 구현한 후에는 Matplotlib 에 등록할 수 있습니다. 이렇게 하면 문자열로 박스 스타일을 지정할 수 있습니다. bbox=dict(boxstyle="registered_name,param=value,...", ...).
BoxStyle._style_list["angled"] = MyStyle ## 사용자 정의 스타일 등록.
사용자 정의 박스 스타일 사용하기
사용자 정의 박스 스타일을 구현하고 등록한 후에는 Axes.text와 함께 사용할 수 있습니다.
fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))
요약
이 랩에서는 Matplotlib 에서 사용자 정의 박스 스타일을 구현하는 방법을 배웠습니다. 함수와 클래스로 사용자 정의 박스 스타일을 만드는 방법을 배웠습니다. 또한 Matplotlib 에 사용자 정의 박스 스타일을 등록하고 Axes.text와 함께 사용하는 방법도 배웠습니다.