경로 자습서 #

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()
경로 튜토리얼

다음 경로 코드가 인식됩니다.

암호

정점

설명

STOP

1(무시)

전체 경로의 끝을 나타내는 마커(현재 필요하지 않으며 무시됨).

MOVETO

1

펜을 들고 주어진 정점으로 이동합니다.

LINETO

1

현재 위치에서 주어진 정점까지 선을 그립니다.

CURVE3

2: 제어점 1개, 끝점 1개

주어진 제어점을 사용하여 현재 위치에서 주어진 끝점까지 2차 베지어 곡선을 그립니다.

CURVE4

3: 제어점 2개, 끝점 1개

주어진 제어점을 사용하여 현재 위치에서 주어진 끝점까지 3차 베지어 곡선을 그립니다.

CLOSEPOLY

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()
경로 튜토리얼

복합 경로 #

matplotlib, Rectangle, Circle, Polygon 등의 모든 간단한 패치 프리미티브는 간단한 경로로 구현됩니다. 여러 개의 기본 요소(예: 직사각형 묶음)를 생성하는 hist()및 와 같은 플로팅 함수 는 일반적으로 복합 경로를 사용하여 보다 효율적으로 구현할 수 있습니다. 복합 경로가 아닌 직사각형 목록을 생성하는 bar()이유 는 대부분 역사적입니다. 코드는 비교적 새롭고 이전 버전입니다. 지금 변경할 수는 있지만 이전 코드를 손상시킬 수 있으므로 여기서는 효율성을 위해 자신의 코드에서 그렇게 해야 하는 경우(예: 애니메이션 막대 그래프.barPathbar

각 히스토그램 막대에 대해 일련의 사각형을 만들어 히스토그램 차트를 만들 것입니다. 사각형 너비는 빈 너비이고 사각형 높이는 해당 빈에 있는 데이터 포인트의 수입니다. 먼저 임의의 정규 분포 데이터를 생성하고 히스토그램을 계산합니다. 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는 각 히스토그램 막대에 대한 개수 배열입니다.

# 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

이제 우리는 각 직사각형에 대해 일련의 MOVETO, LINETO및 로 구성되는 복합 경로를 구성해야 합니다. CLOSEPOLY각 직사각형에 대해 5개의 정점이 필요합니다 . 에 대해 1개 MOVETO, 에 대해 3개, 에 대해 LINETO1개입니다 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()
경로 튜토리얼

Sphinx-Gallery에서 생성한 갤러리