메모
전체 예제 코드를 다운로드 하려면 여기 를 클릭 하십시오.
경로 자습서 #
Matplotlib 시각화에서 경로 정의.
모든 개체의 기본이 되는 matplotlib.patches
개체는 Path
선분과 스플라인으로 구성된 단순한 복합 윤곽선을 그리는 표준 moveto, lineto, curveto 명령 세트를 지원하는 입니다. 는 Path
(x, y) 정점의 (N, 2) 배열과 경로 코드의 N 길이 배열로 인스턴스화됩니다. 예를 들어 (0, 0)에서 (1, 1)까지 단위 사각형을 그리려면 다음 코드를 사용할 수 있습니다.
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
verts = [
(0., 0.), # left, bottom
(0., 1.), # left, top
(1., 1.), # right, top
(1., 0.), # right, bottom
(0., 0.), # ignored
]
codes = [
Path.MOVETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.CLOSEPOLY,
]
path = Path(verts, codes)
fig, ax = plt.subplots()
patch = patches.PathPatch(path, facecolor='orange', lw=2)
ax.add_patch(patch)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
plt.show()
![경로 튜토리얼](/stable/_images/sphx_glr_path_tutorial_001.png)
다음 경로 코드가 인식됩니다.
암호 |
정점 |
설명 |
---|---|---|
|
1(무시) |
전체 경로의 끝을 나타내는 마커(현재 필요하지 않으며 무시됨). |
|
1 |
펜을 들고 주어진 정점으로 이동합니다. |
|
1 |
현재 위치에서 주어진 정점까지 선을 그립니다. |
|
2: 제어점 1개, 끝점 1개 |
주어진 제어점을 사용하여 현재 위치에서 주어진 끝점까지 2차 베지어 곡선을 그립니다. |
|
3: 제어점 2개, 끝점 1개 |
주어진 제어점을 사용하여 현재 위치에서 주어진 끝점까지 3차 베지어 곡선을 그립니다. |
|
1(점은 무시됨) |
현재 폴리라인의 시작점에 선분을 그립니다. |
베지어 예 #
일부 경로 구성 요소는 이를 지정하기 위해 여러 정점이 필요합니다. 예를 들어 CURVE 3은 하나의 제어점과 하나의 끝점이 있는 베지어 곡선이고 CURVE4 에는 두 개의 제어점과 끝점에 대한 세 개의 정점이 있습니다. 아래 예는 CURVE4 베지어 스플라인을 보여줍니다. 베지어 곡선은 시작점, 두 제어점 및 끝점의 볼록 선체에 포함됩니다.
verts = [
(0., 0.), # P0
(0.2, 1.), # P1
(1., 0.8), # P2
(0.8, 0.), # P3
]
codes = [
Path.MOVETO,
Path.CURVE4,
Path.CURVE4,
Path.CURVE4,
]
path = Path(verts, codes)
fig, ax = plt.subplots()
patch = patches.PathPatch(path, facecolor='none', lw=2)
ax.add_patch(patch)
xs, ys = zip(*verts)
ax.plot(xs, ys, 'x--', lw=2, color='black', ms=10)
ax.text(-0.05, -0.05, 'P0')
ax.text(0.15, 1.05, 'P1')
ax.text(1.05, 0.85, 'P2')
ax.text(0.85, -0.05, 'P3')
ax.set_xlim(-0.1, 1.1)
ax.set_ylim(-0.1, 1.1)
plt.show()
![경로 튜토리얼](/stable/_images/sphx_glr_path_tutorial_002.png)
복합 경로 #
matplotlib, Rectangle, Circle, Polygon 등의 모든 간단한 패치 프리미티브는 간단한 경로로 구현됩니다. 여러 개의 기본 요소(예: 직사각형 묶음)를 생성하는 hist()
및 와
같은 플로팅 함수 는 일반적으로 복합 경로를 사용하여 보다 효율적으로 구현할 수 있습니다. 복합 경로가 아닌 직사각형 목록을 생성하는
bar()
이유 는 대부분 역사적입니다. 코드는 비교적 새롭고
이전 버전입니다. 지금 변경할 수는 있지만 이전 코드를 손상시킬 수 있으므로 여기서는 효율성을 위해 자신의 코드에서 그렇게 해야 하는 경우(예: 애니메이션 막대 그래프.bar
Path
bar
각 히스토그램 막대에 대해 일련의 사각형을 만들어 히스토그램 차트를 만들 것입니다. 사각형 너비는 빈 너비이고 사각형 높이는 해당 빈에 있는 데이터 포인트의 수입니다. 먼저 임의의 정규 분포 데이터를 생성하고 히스토그램을 계산합니다. numpy는 중심이 아닌 Bin 가장자리를 반환하기 때문에 길이 는 아래 예의 bins
길이보다 1 더 큽니다 .n
# histogram our data with numpy
data = np.random.randn(1000)
n, bins = np.histogram(data, 100)
이제 사각형의 모서리를 추출합니다. 아래 의 각
left
, bottom
등 배열은 입니다 len(n)
. 여기서 n
는 각 히스토그램 막대에 대한 개수 배열입니다.
이제 우리는 각 직사각형에 대해 일련의 MOVETO
, LINETO
및 로 구성되는 복합 경로를 구성해야 합니다. CLOSEPOLY
각 직사각형에 대해 5개의 정점이 필요합니다 . 에 대해 1개 MOVETO
, 에 대해 3개, 에 대해 LINETO
1개입니다 CLOSEPOLY
. 위의 표에 표시된 대로 클로즈폴리의 정점은 무시되지만 코드를 정점과 정렬된 상태로 유지하려면 여전히 필요합니다.
nverts = nrects*(1+3+1)
verts = np.zeros((nverts, 2))
codes = np.ones(nverts, int) * path.Path.LINETO
codes[0::5] = path.Path.MOVETO
codes[4::5] = path.Path.CLOSEPOLY
verts[0::5, 0] = left
verts[0::5, 1] = bottom
verts[1::5, 0] = left
verts[1::5, 1] = top
verts[2::5, 0] = right
verts[2::5, 1] = top
verts[3::5, 0] = right
verts[3::5, 1] = bottom
남은 것은 경로를 만들고 에 연결
PathPatch
하고 축에 추가하는 것입니다.
barpath = path.Path(verts, codes)
patch = patches.PathPatch(barpath, facecolor='green',
edgecolor='yellow', alpha=0.5)
ax.add_patch(patch)
import numpy as np
import matplotlib.patches as patches
import matplotlib.path as path
fig, ax = plt.subplots()
# Fixing random state for reproducibility
np.random.seed(19680801)
# histogram our data with numpy
data = np.random.randn(1000)
n, bins = np.histogram(data, 100)
# get the corners of the rectangles for the histogram
left = np.array(bins[:-1])
right = np.array(bins[1:])
bottom = np.zeros(len(left))
top = bottom + n
nrects = len(left)
nverts = nrects*(1+3+1)
verts = np.zeros((nverts, 2))
codes = np.ones(nverts, int) * path.Path.LINETO
codes[0::5] = path.Path.MOVETO
codes[4::5] = path.Path.CLOSEPOLY
verts[0::5, 0] = left
verts[0::5, 1] = bottom
verts[1::5, 0] = left
verts[1::5, 1] = top
verts[2::5, 0] = right
verts[2::5, 1] = top
verts[3::5, 0] = right
verts[3::5, 1] = bottom
barpath = path.Path(verts, codes)
patch = patches.PathPatch(barpath, facecolor='green',
edgecolor='yellow', alpha=0.5)
ax.add_patch(patch)
ax.set_xlim(left[0], right[-1])
ax.set_ylim(bottom.min(), top.max())
plt.show()
![경로 튜토리얼](/stable/_images/sphx_glr_path_tutorial_003.png)