ノート
完全なサンプルコードをダウンロードするには、ここをクリックしてください
パスのチュートリアル#
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()
次のパス コードが認識されます
コード |
頂点 |
説明 |
---|---|---|
|
1 (無視) |
パス全体の終わりのマーカー (現在は不要で無視されます)。 |
|
1 |
ペンを手に取り、与えられた頂点に移動します。 |
|
1 |
現在の位置から指定された頂点まで線を引きます。 |
|
2: 1 つの制御点、1 つの終点 |
指定された制御点を使用して、現在の位置から指定された終点まで 2 次ベジエ曲線を描画します。 |
|
3: 2 つの制御点、1 つの終点 |
指定された制御点を使用して、現在の位置から指定された終点までの 3 次ベジエ曲線を描画します。 |
|
1 (ポイントは無視されます) |
現在のポリラインの始点まで線分を描画します。 |
ベジエの例#
一部のパス コンポーネントでは、それらを指定するために複数の頂点が必要です。たとえば、CURVE 3 は1 つの制御点と 1 つの終点を持つベジエ曲線であり、 CURVE4には 2 つの制御点と終点に対して 3 つの頂点があります。以下の例は、CURVE4 ベジエ スプラインを示しています。ベジエ曲線は、始点、2 つの制御点、および終点の凸包に含まれます。
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()
および
のような多数のプリミティブ (たとえば Rectangle の束) を作成するプロット関数はbar()
、通常、複合パスを使用してより効率的に実装できます。その理由bar
は、長方形のリストを作成し、複合パスではなく、大部分が歴史的な
ものです。Path
コードは比較的新しく、それよりも前のbar
ものです。今変更することはできますが、古いコードが壊れてしまうため、ここでは、効率上の理由から独自のコードで行う必要がある場合に備えて、複合パスを作成し、bar の機能を置き換える方法について説明します。アニメーション棒グラフ。
各ヒストグラム バーに一連の長方形を作成してヒストグラム チャートを作成します。長方形の幅はビンの幅であり、長方形の高さはそのビン内のデータポイントの数です。まず、ランダムな正規分布データを作成し、ヒストグラムを計算します。numpy は中心ではなくビンの端を返すため、 の長さは以下の例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
です。上の表に示されているように、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()