ノート
完全なサンプルコードをダウンロードするには、ここをクリックしてください
アーティスト チュートリアル#
Artist オブジェクトを使用してキャンバスにレンダリングします。
Matplotlib API には 3 つの層があります。
これ
matplotlib.backend_bases.FigureCanvas
は、図が描かれる領域ですこれ
matplotlib.backend_bases.Renderer
は、上に描画する方法を知っているオブジェクトですFigureCanvas
matplotlib.artist.Artist
は、レンダラーを使用してキャンバスにペイントする方法を知っているオブジェクトです。
FigureCanvas
と
は、 wxPythonRenderer
などのユーザー インターフェース ツールキットや PostScript® などの描画言語と対話する詳細をすべて処理し、 は、図、テキスト、および線の表現とレイアウトなど、すべての高レベルの構造を処理します。一般的なユーザーは、時間の 95% を で作業することに費やします。Artist
Artists
Artists
には、プリミティブとコンテナの 2 種類があります。プリミティブは、キャンバスにペイントする標準のグラフィカル オブジェクトを表します:
Line2D
、Rectangle
、
Text
、AxesImage
など。コンテナーは、それらを配置する場所 ( Axis
、
Axes
およびFigure
) です。標準的な使用法は、Figure
インスタンスを作成し、 を使用して 1つ
Figure
以上のインスタンスを作成し、インスタンス ヘルパー メソッドを使用してプリミティブを作成することです。以下の例では、 を使用してインスタンスを作成し
ます。これは、インスタンスをインスタンス化し、それらをユーザー インターフェイスまたは描画ツールキットに接続するための便利な方法です。Axes
Subplot
Axes
Figure
matplotlib.pyplot.figure()
Figure
FigureCanvas
. 以下で説明するように、これは必須ではありません。PostScript、PDF Gtk+、または wxPythonFigureCanvas
インスタンスをFigures
直接操作して、直接インスタンス化し、それらを自分で接続できます。ただし、ここでは
Artist
API に焦点を当てているため、pyplot
一部を処理させます。私たちのためのそれらの詳細の:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1) # two rows, one column, first plot
これAxes
は、おそらく Matplotlib API で最も重要なクラスであり、ほとんどの場合使用するクラスです。これは、Axes
がほとんどのオブジェクトが入るプロット領域であり、 には
最も一般的なグラフィックス プリミティブ (それぞれ 、 、 、 ) を作成するための多く
の
特別
な
Axes
ヘルパー メソッド ( plot()
、
、 ) があるためです。これらのヘルパー メソッドは、データ (配列や文字列など)を受け取り、必要に応じてプリミティブ インスタンス ( など) を作成し、それらを関連するコンテナーに追加し、要求に応じて描画します。あなたのほとんどはおそらく についてよく知っているでしょう。text()
hist()
imshow()
Line2D
Text
Rectangle
AxesImage
numpy
Artist
Line2D
Subplot
Axes
Subplot
インスタンス。Axes
任意の場所に
を作成する場合は、0-1 の相対図形座標で値add_axes()
のリストを取得するメソッドを使用するだけです。[left, bottom, width, height]
fig2 = plt.figure()
ax2 = fig2.add_axes([0.15, 0.1, 0.7, 0.3])
例を続けます。
この例でax
は、 は上記Axes
の呼び出しによって作成されたインスタンス
であり (は の単なるサブクラスである
ことをfig.add_subplot
思い出してください)、 を呼び出すと、インスタンスが作成され、に追加されます。以下のインタラクティブなIPython
セッションでは、リストの長さが 1 で、呼び出しによって返されたのと同じ行が含まれていることがわかります。Subplot
Axes
ax.plot
Line2D
Axes
Axes.lines
line, = ax.plot...
In [101]: ax.lines[0]
Out[101]: <matplotlib.lines.Line2D at 0x19a95710>
In [102]: line
Out[102]: <matplotlib.lines.Line2D at 0x19a95710>
その後 を呼び出すとax.plot
(保留状態がデフォルトの "on" の場合)、追加の行がリストに追加されます。remove
メソッドを呼び出すことで、後で行を削除できます。
Axes には、x 軸と y 軸の目盛り、目盛りラベル、および軸ラベルを構成および装飾するためのヘルパー メソッドもあります。
xtext = ax.set_xlabel('my xdata') # returns a Text instance
ytext = ax.set_ylabel('my ydata')
を呼び出すと、 の
インスタンスax.set_xlabel
に関する情報が渡されます。各
インスタンスにはと の
インスタンスが含まれており、目盛り、目盛りラベル、軸ラベルのレイアウトと描画を処理します。Text
XAxis
Axes
XAxis
YAxis
下の図を作ってみてください。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
fig.subplots_adjust(top=0.8)
ax1 = fig.add_subplot(211)
ax1.set_ylabel('volts')
ax1.set_title('a sine wave')
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)
line, = ax1.plot(t, s, color='blue', lw=2)
# Fixing random state for reproducibility
np.random.seed(19680801)
ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3])
n, bins, patches = ax2.hist(np.random.randn(1000), 50,
facecolor='yellow', edgecolor='yellow')
ax2.set_xlabel('time (s)')
plt.show()
オブジェクトのカスタマイズ#
図のすべての要素は Matplotlib によって表され、
Artist
それぞれにその外観を構成するためのプロパティの広範なリストがあります。Figure 自体には Figure の
Rectangle
正確なサイズが含まれており、これを使用して Figure の背景色と透明度を設定できます。同様に、各Axes
バウンディング ボックス (典型的な Matplotlib プロットの黒いエッジを持つ標準的な白いボックスにRectangle
は、Axes の色、透明度、およびその他のプロパティを決定するインスタンスがあります。これらのインスタンスはメンバー変数として格納されFigure.patch
、Axes.patch
("Patch" はMATLAB から継承された名前であり、Figure 上の色の 2D "パッチ" です (例: 四角形、円、および多角形)。すべての MatplotlibArtist
には次のプロパティがあります。
財産 |
説明 |
---|---|
アルファ |
透明度 - 0 ~ 1 のスカラー |
アニメーション |
アニメーション描画を容易にするために使用されるブール値 |
軸 |
アーティストが住んでいる斧、おそらくなし |
クリップボックス |
アーティストをクリップするバウンディング ボックス |
クリップオン |
クリッピングが有効かどうか |
クリップパス |
アーティストがクリッピングされるパス |
含む |
アーティストにピックポイントが含まれているかどうかをテストするピッキング機能 |
形 |
アーティストが住んでいる図のインスタンス。おそらく None |
ラベル |
テキスト ラベル (例: 自動ラベル付け用) |
ピッカー |
オブジェクトのピッキングを制御する Python オブジェクト |
変身 |
変換 |
見える |
アーティストを描画するかどうかのブール値 |
ズーダー |
描画順を決める番号 |
ラスタライズされた |
ブール値; ベクトルをラスター グラフィックスに変換します (圧縮と EPS 透過性のため)。 |
各プロパティは、昔ながらのセッターまたはゲッターでアクセスされます (はい、これが Pythonista を苛立たせていることはわかっています。プロパティまたはトレイトを介した直接アクセスをサポートする予定ですが、まだ行われていません)。たとえば、現在のアルファを 2 倍にするには、次のようにします。
a = o.get_alpha()
o.set_alpha(0.5*a)
一度に多数のプロパティを設定する場合は、set
キーワード引数を指定してメソッドを使用することもできます。例えば:
o.set(alpha=0.5, zorder=2)
Artist
Python シェルでインタラクティブに作業している場合、プロパティ
を検査する便利な方法は、プロパティとその値を一覧表示するmatplotlib.artist.getp()
関数を (単に
pyplot で) 使用することです。これは、や などgetp()
から派生したクラスでも機能します。上記の四角形のプロパティは次のとおりです。Artist
Figure
Rectangle
Figure
In [149]: matplotlib.artist.getp(fig.patch)
agg_filter = None
alpha = None
animated = False
antialiased or aa = False
bbox = Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0)
capstyle = butt
children = []
clip_box = None
clip_on = True
clip_path = None
contains = None
data_transform = BboxTransformTo( TransformedBbox( Bbox...
edgecolor or ec = (1.0, 1.0, 1.0, 1.0)
extents = Bbox(x0=0.0, y0=0.0, x1=640.0, y1=480.0)
facecolor or fc = (1.0, 1.0, 1.0, 1.0)
figure = Figure(640x480)
fill = True
gid = None
hatch = None
height = 1
in_layout = False
joinstyle = miter
label =
linestyle or ls = solid
linewidth or lw = 0.0
patch_transform = CompositeGenericTransform( BboxTransformTo( ...
path = Path(array([[0., 0.], [1., 0.], [1.,...
path_effects = []
picker = None
rasterized = None
sketch_params = None
snap = None
transform = CompositeGenericTransform( CompositeGenericTra...
transformed_clip_path_and_affine = (None, None)
url = None
verts = [[ 0. 0.] [640. 0.] [640. 480.] [ 0. 480....
visible = True
width = 1
window_extent = Bbox(x0=0.0, y0=0.0, x1=640.0, y1=480.0)
x = 0
xy = (0, 0)
y = 0
zorder = 1
すべてのクラスの docstring にもプロパティが含まれているため、特定のオブジェクトのプロパティのリストArtist
については、インタラクティブな「ヘルプ」または
matplotlib.artistを参照できます。
オブジェクトコンテナ#
構成したい特定のオブジェクトのプロパティを調べて設定する方法がわかったので、そのオブジェクトに到達する方法を知る必要があります。冒頭で述べたように、オブジェクトにはプリミティブとコンテナーの 2 種類があります。プリミティブは通常、構成したいもの (Text
インスタンスのフォント、 の幅Line2D
) ですが、コンテナにもいくつかのプロパティがあります。たとえば、
はプロット内の多くのプリミティブを含むコンテナですが、また、x 軸が「線形」か「対数」かを制御する のようなプロパティもあります。このセクションでは、さまざまなコンテナ オブジェクトが目的のオブジェクトを格納する場所を確認します。Axes
Artist
xscale
Artists
フィギュアコンテナ番号
最上位のコンテナArtist
は
matplotlib.figure.Figure
で、図のすべてが含まれています。Figure の背景
Rectangle
は に格納されて
Figure.patch
いる です。サブプロット ( add_subplot()
) と軸 ( add_axes()
) を Figure に追加すると、これらは に追加されますFigure.axes
。これらは、それらを作成するメソッドによっても返されます。
In [156]: fig = plt.figure()
In [157]: ax1 = fig.add_subplot(211)
In [158]: ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3])
In [159]: ax1
Out[159]: <AxesSubplot:>
In [160]: print(fig.axes)
[<AxesSubplot:>, <matplotlib.axes._axes.Axes object at 0x7f0768702be0>]
この図は、pylab/pyplot ステート マシンをサポートするために「現在の Axes」(
Figure.gca
および
を参照Figure.sca
) の概念を維持しているため、Axes リストから直接 Axes を挿入または削除するのではなく、
add_subplot()
および
add_axes()
メソッドを使用して挿入し、
Axes.remove
メソッド削除します。Axes
ただし、カスタマイズしたいインスタンスにアクセスするために、Axes のリストを反復したり、それにインデックスを付けたりすることは自由です。すべての Axes グリッドをオンにする例を次に示します。
for ax in fig.axes:
ax.grid(True)
Figure には独自のimages
、lines
、patches
およびtext
属性もあり、これらを使用してプリミティブを直接追加できます。その場合、 のデフォルトの座標系Figure
は単純にピクセル単位になります (これは通常、希望するものではありません)。代わりに Figure レベルのメソッドを使用してアーティストを追加する場合 (たとえば、 を使用Figure.text
してテキストを追加する場合)、デフォルトの座標系は「Figure 座標」になります。ここで、(0, 0) は Figure の左下、(1, 1 ) は図の右上です。
すべてArtist
の と同様に、 transform プロパティを設定することでこの座標系を制御できます。Artist
変換をfig.transFigure
次のように設定することで、「フィギュア座標」を明示的に使用できます。
import matplotlib.lines as lines
fig = plt.figure()
l1 = lines.Line2D([0, 1], [0, 1], transform=fig.transFigure, figure=fig)
l2 = lines.Line2D([0, 1], [1, 0], transform=fig.transFigure, figure=fig)
fig.lines.extend([l1, l2])
plt.show()
フィギュアに含まれるアーティストの概要は次のとおりです。
図形属性 |
説明 |
---|---|
軸 |
|
パッチ |
|
画像 |
|
伝説 |
Figure |
行 |
Figure |
パッチ |
Figure |
テキスト |
Figure |
軸コンテナ#
matplotlib.axes.Axes
は Matplotlib ユニバースの中心です。図で使用されるすべての大部分が含まれており、Artists
これらを作成してそれ自体に追加するための多くのヘルパー メソッドと
、そこに含まArtists
れる にアクセスしてカスタマイズするためのヘルパー メソッドがありArtists
ます。と同様に
、デカルト座標
用の と極座標用の がFigure
含まれて
い
ます。このパッチは、プロット領域の形状、背景、および境界を決定します。Patch
patch
Rectangle
Circle
ax = fig.add_subplot()
rect = ax.patch # a Rectangle instance
rect.set_facecolor('green')
canonical などのプロット メソッドを呼び出して
plot
値の配列またはリストを渡すと、メソッドはインスタンスを作成し、キーワード引数として渡されmatplotlib.lines.Line2D
たすべてのプロパティで行を更新し、その行をに追加して、それをユーザーに返します。 :Line2D
Axes
In [213]: x, y = np.random.rand(2, 100)
In [214]: line, = ax.plot(x, y, '-', color='blue', linewidth=2)
plot
複数の x、y ペアをプロットに渡すことができるため、行のリストを返します。長さ 1 のリストの最初の要素を line 変数にアンパックしています。次の行が
Axes.lines
リストに追加されました。
In [229]: print(ax.lines)
[<matplotlib.lines.Line2D at 0xd378b0c>]
同様に、
bar()
長方形のリストを作成するなど、パッチを作成するメソッドは、パッチをAxes.patches
リストに追加します。
In [233]: n, bins, rectangles = ax.hist(np.random.randn(1000), 50)
In [234]: rectangles
Out[234]: <BarContainer object of 50 artists>
In [235]: print(len(ax.patches))
Out[235]: 50
Axes.lines
またはAxes.patches
リストにオブジェクトを直接追加しないでくださいAxes
。オブジェクトを作成および追加するときに がいくつかのことを行う必要があるためです。
;の
figure
andaxes
プロパティを設定します。Artist
デフォルトの
Axes
変換を設定します (既に設定されていない場合)。に含まれるデータを検査して、
Artist
自動スケーリングを制御するデータ構造を更新し、プロットされたデータを含むようにビュー制限を調整できるようにします。
それでも、自分でオブジェクトを作成し、
や など
のAxes
ヘルパー メソッドを使用して に直接追加することができます。以下は、何が起こっているかを説明する注釈付きの対話型セッションです。add_line
add_patch
In [262]: fig, ax = plt.subplots()
# create a rectangle instance
In [263]: rect = matplotlib.patches.Rectangle((1, 1), width=5, height=12)
# by default the axes instance is None
In [264]: print(rect.axes)
None
# and the transformation instance is set to the "identity transform"
In [265]: print(rect.get_data_transform())
IdentityTransform()
# now we add the Rectangle to the Axes
In [266]: ax.add_patch(rect)
# and notice that the ax.add_patch method has set the axes
# instance
In [267]: print(rect.axes)
Axes(0.125,0.1;0.775x0.8)
# and the transformation has been set too
In [268]: print(rect.get_data_transform())
CompositeGenericTransform(
TransformWrapper(
BlendedAffine2D(
IdentityTransform(),
IdentityTransform())),
CompositeGenericTransform(
BboxTransformFrom(
TransformedBbox(
Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0),
TransformWrapper(
BlendedAffine2D(
IdentityTransform(),
IdentityTransform())))),
BboxTransformTo(
TransformedBbox(
Bbox(x0=0.125, y0=0.10999999999999999, x1=0.9, y1=0.88),
BboxTransformTo(
TransformedBbox(
Bbox(x0=0.0, y0=0.0, x1=6.4, y1=4.8),
Affine2D(
[[100. 0. 0.]
[ 0. 100. 0.]
[ 0. 0. 1.]])))))))
# the default axes transformation is ax.transData
In [269]: print(ax.transData)
CompositeGenericTransform(
TransformWrapper(
BlendedAffine2D(
IdentityTransform(),
IdentityTransform())),
CompositeGenericTransform(
BboxTransformFrom(
TransformedBbox(
Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0),
TransformWrapper(
BlendedAffine2D(
IdentityTransform(),
IdentityTransform())))),
BboxTransformTo(
TransformedBbox(
Bbox(x0=0.125, y0=0.10999999999999999, x1=0.9, y1=0.88),
BboxTransformTo(
TransformedBbox(
Bbox(x0=0.0, y0=0.0, x1=6.4, y1=4.8),
Affine2D(
[[100. 0. 0.]
[ 0. 100. 0.]
[ 0. 0. 1.]])))))))
# notice that the xlimits of the Axes have not been changed
In [270]: print(ax.get_xlim())
(0.0, 1.0)
# but the data limits have been updated to encompass the rectangle
In [271]: print(ax.dataLim.bounds)
(1.0, 1.0, 5.0, 12.0)
# we can manually invoke the auto-scaling machinery
In [272]: ax.autoscale_view()
# and now the xlim are updated to encompass the rectangle, plus margins
In [273]: print(ax.get_xlim())
(0.75, 6.25)
# we have to manually force a figure draw
In [274]: fig.canvas.draw()
プリミティブを作成し、それぞれのコンテナーに追加するAxes
ためのヘルパー メソッド
は非常に多くあります。Artists
以下の表は、それらの小さなサンプル、それらがArtist
作成する種類、およびそれらを保存する場所をまとめたものです。
軸ヘルパー メソッド |
アーティスト |
容器 |
---|---|---|
|
ax.テキスト |
|
|
ax.パッチ |
|
|
ax.lines と ax.patches |
|
|
ax.パッチ |
|
|
ax.パッチ |
|
|
ax.images |
|
|
ax.get_legend() |
|
|
斧線 |
|
|
ax.コレクション |
|
|
ax.テキスト |
これらすべての に加えてArtists
、 には とAxes
という 2 つの重要なArtist
コンテナが含まれてXAxis
おりYAxis
、目盛りとラベルの描画を処理します。これらは、インスタンス変数
xaxis
および
として保存されますyaxis
。および
コンテナーについては以下で詳しく説明しますが、 には、呼び出しをインスタンスに転送する多くのヘルパー メソッドが含まれているため、必要でない限り直接操作する必要がないことが多いことに注意しXAxis
てください
。たとえば、ヘルパー メソッドを使用して目盛りラベルのフォントの色を設定できます。YAxis
Axes
Axis
XAxis
Axes
ax.tick_params(axis='x', labelcolor='orange')
Axes
以下は、含まれているアーティストの概要です。
軸アトリビュート |
説明 |
---|---|
アーティスト |
インスタンス |
パッチ |
|
コレクション |
インスタンス |
画像 |
|
行 |
インスタンス |
パッチ |
インスタンス |
テキスト |
インスタンス |
軸 |
|
y軸 |
|
凡例にはget_legend
、
軸コンテナ#
matplotlib.axis.Axis
インスタンスは、目盛り線、グリッド線、目盛りラベル、および軸ラベルの描画を処理します。y 軸には左右の目盛りを個別に、x 軸には上下の目盛りを個別に設定できます。はAxis
、自動スケーリング、パン、およびズームで使用されるデータとビュー間隔、および目盛りの配置場所と文字列としての表現方法を制御するLocator
および
インスタンスも格納します。Formatter
各Axis
オブジェクトには、label
アトリビュート (および
pyplot
の呼び出しで変更されるもの) と、大目盛りと小目盛りのリストが含まれています。目盛りは
インスタンスであり、目盛りと目盛りラベルをレンダリングする実際の線とテキストのプリミティブが含まれています。目盛りは必要に応じて動的に作成されるため (たとえば、パンやズームの場合)、アクセサ メソッド
およびを介して大目盛りと小目盛りのリストにアクセスする必要があります。ティックにはすべてのプリミティブが含まれており、以下で説明しますが、
インスタンスにはティック ライン、ティック ラベル、ティック位置などを返すアクセサ メソッドがあります。xlabel
ylabel
axis.XTick
axis.YTick
axis.Axis.get_major_ticks
axis.Axis.get_minor_ticks
Axis
fig, ax = plt.subplots()
axis = ax.xaxis
axis.get_ticklocs()
array([0. , 0.2, 0.4, 0.6, 0.8, 1. ])
[Text(0.0, 0, '0.0'), Text(0.2, 0, '0.2'), Text(0.4, 0, '0.4'), Text(0.6000000000000001, 0, '0.6'), Text(0.8, 0, '0.8'), Text(1.0, 0, '1.0')]
デフォルトでは、上部と下部に目盛り線がありますが、x 軸の下の目盛りラベルのみがあるため、ラベルの 2 倍の目盛り線があることに注意してください。ただし、これはカスタマイズできます。
<a list of 12 Line2D ticklines objects>
上記のメソッドでは、デフォルトでメジャー ティックのリストのみが返されますが、マイナー ティックを要求することもできます。
axis.get_ticklabels(minor=True)
axis.get_ticklines(minor=True)
<a list of 0 Line2D ticklines objects>
の便利なアクセサ メソッドの概要を次に示しますAxis
(これらには、 などの便利な対応するセッターがあり
set_major_formatter()
ます)。
軸アクセサ メソッド |
説明 |
---|---|
軸のスケール。例: 'log' または 'linear' |
|
軸ビュー制限の間隔インスタンス |
|
軸データ制限の間隔インスタンス |
|
軸のグリッド線のリスト |
|
軸ラベル - |
|
軸オフセット テキスト - |
|
インスタンスのリスト |
|
インスタンスのリスト |
|
ティック位置のリスト - キーワード minor=True|False |
|
メジャー ティックの |
|
メジャー ティックの |
|
小刻みの |
|
小刻みの |
|
|
|
|
|
主目盛りまたは副目盛りのグリッドをオンまたはオフにする |
これは、Axes および Tick プロパティをカスタマイズする、その美しさから推奨されない例です。
# plt.figure creates a matplotlib.figure.Figure instance
fig = plt.figure()
rect = fig.patch # a rectangle instance
rect.set_facecolor('lightgoldenrodyellow')
ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4])
rect = ax1.patch
rect.set_facecolor('lightslategray')
for label in ax1.xaxis.get_ticklabels():
# label is a Text instance
label.set_color('red')
label.set_rotation(45)
label.set_fontsize(16)
for line in ax1.yaxis.get_ticklines():
# line is a Line2D instance
line.set_color('green')
line.set_markersize(25)
line.set_markeredgewidth(3)
plt.show()
ティックコンテナ#
は、からへの
降下matplotlib.axis.Tick
における最後のコンテナ オブジェクトです。には、目盛りとグリッド ラインのインスタンス、および上目盛りと下目盛りのラベル インスタンスが含まれます。これらのそれぞれは、 の属性として直接アクセスできます。Figure
Axes
Axis
Tick
Tick
Tick
ティック属性 |
説明 |
---|---|
tick1line |
|
tick2line |
|
グリッド線 |
|
ラベル1 |
|
ラベル2 |
|
これは、ドル記号で右側の目盛りのフォーマッターを設定し、y 軸の右側で緑色に色付けする例です。
import numpy as np
import matplotlib.pyplot as plt
# Fixing random state for reproducibility
np.random.seed(19680801)
fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20))
# Use automatic StrMethodFormatter
ax.yaxis.set_major_formatter('${x:1.2f}')
ax.yaxis.set_tick_params(which='major', labelcolor='green',
labelleft=False, labelright=True)
plt.show()
スクリプトの合計実行時間: ( 0 分 1.067 秒)