|
matplotlib、Rectangle、Circle、Polygon などのすべての単純なパッチプリミティブは、単純なパスで実装されています。 hist() や bar() のような多数のプリミティブを作成するプロット関数は、通常、複合矩形を使用してより効率的に実装できます。理由バーは長方形のリストを作成し、複合パスではなく、主に歴史的です: Path code は比較的新しいものであり、バーはそれを先行します。これを今変更することはできますが、古いコードが破損する可能性があるので、コンパイルパスを作成し、bar の機能を置き換える方法について説明します。効率的な理由から独自のコードで行う必要がある場合アニメーションバープロット。
各ヒストグラムバーの一連の長方形を作成して、ヒストグラムチャートを作成します。長方形の幅はビンの幅で、長方形の高さはビン内のデータポイントの数です。まずランダムに正規分布したデータを作成し、ヒストグラムを計算します。 numpy はセンタではなくビンの辺を返すので、ビンの長さは以下の例のnの長さよりも1大きい:
# histogram our data with numpy
data = np.random.randn(1000)
n, bins = np.histogram(data, 100)
ここで、長方形の角を抽出します。 下の左、下などの各配列は 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 からなる複合パスを構築する必要があります。 各矩形に対して、MOVETO は 1、LINETOは3、CLOSEPOLY は 1 の 5 つの頂点が必要です。 上の表に示されているように、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 にアタッチし、Axes に追加することだけです。
barpath = path.Path(verts, codes)
patch = patches.PathPatch(barpath, facecolor='green',
edgecolor='yellow', alpha=0.5)
ax.add_patch(patch)
import matplotlib.pyplot as plt
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()

Top
|