クイック スタート ガイド#

このチュートリアルでは、Matplotlib を使い始めるのに役立ついくつかの基本的な使用パターンとベスト プラクティスについて説明します。

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

簡単な例#

Matplotlib は、Figures (ウィンドウ、Jupyter ウィジェットなど) 上のデータをグラフ化します。各データにAxesは、xy 座標 (または極座標プロットの theta-r、xyz 3D プロットなど)。Axes を使用して Figure を作成する最も簡単な方法は、 を使用することpyplot.subplotsです。Axes.plot次に、Axes にいくつかのデータを描画するために使用できます 。

fig, ax = plt.subplots()  # Create a figure containing a single axes.
ax.plot([1, 2, 3, 4], [1, 4, 2, 3]);  # Plot some data on the axes.
クイックスタート
[<matplotlib.lines.Line2D object at 0x7f2cdf586e60>]

図のパーツ#

Matplotlib Figure のコンポーネントは次のとおりです。

../../_images/anatomy.png

Figure#

全体像。Figure は、すべての child Axes、「特別な」アーティストのグループ (タイトル、図の凡例、カラーバーなど)、さらにはネストされたサブフィギュアを追跡します。

新しい Figure を作成する最も簡単な方法は、pyplot を使用することです。

fig = plt.figure()  # an empty figure with no Axes
fig, ax = plt.subplots()  # a figure with a single Axes
fig, axs = plt.subplots(2, 2)  # a figure with a 2x2 grid of Axes

Figure と一緒に Axes を作成すると便利なことがよくありますが、後で手動で Axes を追加することもできます。多くのMatplotlib バックエンドは、Figure ウィンドウでのズームとパンをサポートしていることに注意してください 。

Axes#

Axes は、データをプロットするための領域を含む Figure にアタッチされたアーティストであり、通常、 提供する目盛りと目盛りラベルを提供する2 つ (または 3D の場合は 3 つ) のオブジェクト ( AxesAxisAxisの違いに注意してください) を含みます。 Axes のデータをスケーリングします。それぞれには、タイトル (で設定)、x ラベル ( で設定 )、および で設定された y ラベルもあります )。Axesset_title()set_xlabel()set_ylabel()

クラスとそのAxesメンバー関数は、OOP インターフェイスを操作するための主要なエントリ ポイントであり、ほとんどのプロット メソッドが定義されています (たとえばax.plot()、上記のplotメソッドを使用します) 。

Axis#

これらのオブジェクトは、スケールと制限を設定し、目盛り (軸上のマーク) と目盛りラベル (目盛りにラベルを付ける文字列) を生成します。目盛りの位置はオブジェクトによって決定されLocator、目盛りラベル文字列はFormatter. 正しいLocatorとの組み合わせによりFormatter、目盛りの位置とラベルを非常に細かく制御できます。

Artist#

基本的に、Figure に表示されるものはすべてアーティストです ( FigureAxes、およびAxisオブジェクトも)。これには 、オブジェクトTextLine2Dオブジェクト、collectionsオブジェクト、Patch オブジェクトなどが含まれます。フィギュアがレンダリングされると、すべてのアーティストがキャンバスに描画されます。ほとんどのアーティストは軸に関連付けられています。このようなアーティストは、複数の Axes で共有したり、別の Axes に移動したりすることはできません。

プロット関数への入力の種類#

プロット関数は、numpy.arrayまたはnumpy.ma.masked_arrayを入力として、または に渡すことができるオブジェクトを想定していnumpy.asarrayます。pandas データ オブジェクトなどの配列に似た (「配列のような」) クラスはnumpy.matrix、意図したとおりに機能しない可能性があります。numpy.array一般的な規則は、プロットする前にこれらをオブジェクトに変換することです。たとえば、numpy.matrix

b = np.matrix([[1, 2], [3, 4]])
b_asarray = np.asarray(b)

ほとんどのメソッドは、 dict、 a numpy.recarray、または aなどのアドレス指定可能なオブジェクトも解析しますpandas.DataFrame。Matplotlib では、dataキーワード引数を指定して、xおよびy変数に対応する文字列を渡すプロットを生成できます。

np.random.seed(19680801)  # seed the random number generator.
data = {'a': np.arange(50),
        'c': np.random.randint(0, 50, 50),
        'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100

fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.scatter('a', 'b', c='c', s='d', data=data)
ax.set_xlabel('entry a')
ax.set_ylabel('entry b');
クイックスタート
Text(36.334, 0.5, 'entry b')

コーディング スタイル#

明示的および暗黙的なインターフェース#

上記のように、Matplotlib を使用するには基本的に 2 つの方法があります。

  • Figure と Axes を明示的に作成し、それらのメソッドを呼び出します (「オブジェクト指向 (OO) スタイル」)。

  • Figure と Axes を暗黙的に作成および管理するために pyplot に依存し、プロットには pyplot 関数を使用します。

暗黙的インターフェイスと明示的インターフェイスの間のトレードオフの説明については、Matplotlib アプリケーション インターフェイス (API)を参照してください。

したがって、OOスタイルを使用できます

x = np.linspace(0, 2, 100)  # Sample data.

# Note that even in the OO-style, we use `.pyplot.figure` to create the Figure.
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.plot(x, x, label='linear')  # Plot some data on the axes.
ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...
ax.plot(x, x**3, label='cubic')  # ... and some more.
ax.set_xlabel('x label')  # Add an x-label to the axes.
ax.set_ylabel('y label')  # Add a y-label to the axes.
ax.set_title("Simple Plot")  # Add a title to the axes.
ax.legend();  # Add a legend.
単純なプロット
<matplotlib.legend.Legend object at 0x7f2cdf587f70>

または pyplot スタイル:

x = np.linspace(0, 2, 100)  # Sample data.

plt.figure(figsize=(5, 2.7), layout='constrained')
plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic')  # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend();
単純なプロット
<matplotlib.legend.Legend object at 0x7f2cfa992cb0>

(さらに、GUI アプリケーションに Matplotlib を埋め込む場合の 3 番目のアプローチがあります。これは、図の作成であっても pyplot を完全に削除します。詳細については、ギャラリーの対応するセクションを参照してください: グラフィカル ユーザー インターフェイスへの Matplotlib の埋め込み。)

Matplotlib のドキュメントと例では、OO と pyplot の両方のスタイルを使用しています。一般に、特に複雑なプロット、および大規模なプロジェクトの一部として再利用することを意図した関数とスクリプトには、OO スタイルを使用することをお勧めします。ただし、pyplot スタイルは、迅速な対話型作業に非常に便利です。

ノート

pylabを介して、インターフェースを使用する古い例を見つけることができます。このアプローチは強く非推奨です。from pylab import *

ヘルパー関数の作成#

異なるデータセットで同じプロットを何度も作成する必要がある場合、または Matplotlib メソッドを簡単にラップしたい場合は、以下の推奨シグネチャ関数を使用してください。

def my_plotter(ax, data1, data2, param_dict):
    """
    A helper function to make a graph.
    """
    out = ax.plot(data1, data2, **param_dict)
    return out

これを 2 回使用して、2 つのサブプロットを作成します。

data1, data2, data3, data4 = np.random.randn(4, 100)  # make 4 random data sets
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(5, 2.7))
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'});
クイックスタート
[<matplotlib.lines.Line2D object at 0x7f2cddab7c10>]

これらを python パッケージとしてインストールする場合、またはその他のカスタマイズを行う場合は、Web 上の多くのテンプレートのいずれかを使用できます。Matplotlib にはmpl-cookiecutterがあります

スタイリングアーティスト#

ほとんどのプロット メソッドには、プロット メソッドが呼び出されたとき、またはアーティストの「セッター」からアクセスできる、アーティスト用のスタイリング オプションがあります。以下のプロットでは、によって作成されたアーティストの線幅、および線スタイルplotを手動で設定し、事後に 2 行目の線スタイルを で設定しset_linestyleます。

fig, ax = plt.subplots(figsize=(5, 2.7))
x = np.arange(len(data1))
ax.plot(x, np.cumsum(data1), color='blue', linewidth=3, linestyle='--')
l, = ax.plot(x, np.cumsum(data2), color='orange', linewidth=2)
l.set_linestyle(':');
クイックスタート

#

Matplotlib には、ほとんどのアーティストに受け入れられる非常に柔軟な色の配列があります。仕様のリストについては、色のチュートリアルを参照してください。一部のアーティストは複数の色を使用します。つまり、scatterプロットの場合、マーカーの端は内部とは異なる色にすることができます:

fig, ax = plt.subplots(figsize=(5, 2.7))
ax.scatter(data1, data2, s=50, facecolor='C0', edgecolor='k');
クイックスタート
<matplotlib.collections.PathCollection object at 0x7f2cddcf8280>

線幅、線種、マーカーサイズ#

線の幅は通常、タイポグラフィ ポイント (1 pt = 1/72 インチ) で表され、ストローク線を持つアーティストに使用できます。同様に、ストローク ラインにはライン スタイルを設定できます。線種の例を参照してください。

マーカーのサイズは、使用する方法によって異なります。plotマーカーサイズをポイント単位で指定し、通常はマーカーの「直径」または幅です。scatterマーカーの視覚領域にほぼ比例するようにマーカーサイズを指定します。文字列コードとして使用できるマーカー スタイルの配列があります (「 」を参照markers)。または、ユーザーが独自に定義することもできますMarkerStyle(「 マーカー リファレンス」を参照)。

fig, ax = plt.subplots(figsize=(5, 2.7))
ax.plot(data1, 'o', label='data1')
ax.plot(data2, 'd', label='data2')
ax.plot(data3, 'v', label='data3')
ax.plot(data4, 's', label='data4')
ax.legend();
クイックスタート
<matplotlib.legend.Legend object at 0x7f2cfa946650>

プロットのラベリング#

軸ラベルとテキスト#

set_xlabelset_ylabel、およびset_titleは、指定された場所にテキストを追加するために使用されます (詳細については、Matplotlib プロット のテキストを参照してください)。を使用して、テキストをプロットに直接追加することもできます text

mu, sigma = 115, 15
x = mu + sigma * np.random.randn(10000)
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
# the histogram of the data
n, bins, patches = ax.hist(x, 50, density=True, facecolor='C0', alpha=0.75)

ax.set_xlabel('Length [cm]')
ax.set_ylabel('Probability')
ax.set_title('Aardvark lengths\n (not really)')
ax.text(75, .025, r'$\mu=115,\ \sigma=15$')
ax.axis([55, 175, 0, 0.03])
ax.grid(True);
ツチブタの長さ(実際にはそうではありません)

すべてのtext関数はmatplotlib.text.Text インスタンスを返します。上記の行と同様に、キーワード引数をテキスト関数に渡すことでプロパティをカスタマイズできます。

t = ax.set_xlabel('my data', fontsize=14, color='red')

これらのプロパティについては、 Text プロパティとレイアウトで詳しく説明し ます。

テキストでの数式の使用#

Matplotlib は、任意のテキスト式で TeX 方程式式を受け入れます。たとえば、式を書くには\(\sigma_i=15\)タイトルでは、ドル記号で囲まれた TeX 式を書くことができます。

ax.set_title(r'$\sigma_i=15$')

ここでr、タイトル文字列の前にある文字列は、文字列が の文字列であり、バックスラッシュを Python エスケープとして扱わないことを示します。Matplotlib には組み込みの TeX 式パーサーとレイアウト エンジンがあり、独自の数学フォントが付属しています。詳細については、「数式の記述」を参照して ください。また、LaTeX を直接使用してテキストをフォーマットし、出力をディスプレイの図または保存されたポストスクリプトに直接組み込むこともできます – LaTeX を使用したテキスト レンダリング を参照してください。

注釈#

多くの場合、 xyを指す矢印をxytextのテキストに接続することにより、プロット上の点に注釈を付けることもできます。

fig, ax = plt.subplots(figsize=(5, 2.7))

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2 * np.pi * t)
line, = ax.plot(t, s, lw=2)

ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='black', shrink=0.05))

ax.set_ylim(-2, 2);
クイックスタート
(-2.0, 2.0)

この基本的な例では、xyxytextの両方がデータ座標にあります。他にもさまざまな座標系を選択できます 。詳細については、基本的な注釈高度な注釈を参照してください。Annotating Plotsにも、より多くの例があります 。

伝説#

多くの場合、行またはマーカーを で識別したいAxes.legend:

fig, ax = plt.subplots(figsize=(5, 2.7))
ax.plot(np.arange(len(data1)), data1, label='data1')
ax.plot(np.arange(len(data2)), data2, label='data2')
ax.plot(np.arange(len(data3)), data3, 'd', label='data3')
ax.legend();
クイックスタート
<matplotlib.legend.Legend object at 0x7f2cde2aaa40>

Matplotlib の凡例は、レイアウト、配置、およびそれらが表すことができるアーティストに関して非常に柔軟です。詳細については、 レジェンド ガイドを参照してください。

軸のスケールと目盛り#

各軸にはAxis、x 軸と y 軸を表す 2 つ (または 3 つ) のオブジェクトがあります。これらは、軸、目盛りロケーター、および目盛りフォーマッターのスケールを制御します。追加の Axes をアタッチして、さらに Axis オブジェクトを表示できます。

スケール#

線形スケールに加えて、Matplotlib は対数スケールなどの非線形スケールを提供します。loglog対数スケールが多用されるため、semilogx、 、 など の直接的な方法もありsemilogyます。多くのスケールがあります ( 他の例については、スケールを参照してください)。ここでは、スケールを手動で設定します。

fig, axs = plt.subplots(1, 2, figsize=(5, 2.7), layout='constrained')
xdata = np.arange(len(data1))  # make an ordinal for this
data = 10**data1
axs[0].plot(xdata, data)

axs[1].set_yscale('log')
axs[1].plot(xdata, data);
クイックスタート
[<matplotlib.lines.Line2D object at 0x7f2cde4a5930>]

スケールは、データ値から軸に沿った間隔へのマッピングを設定します。これは両方向で発生し、変換に結合されます。これは、Matplotlib がデータ座標から Axes、Figure、または画面座標にマップする方法です。変換のチュートリアルを参照してください。

目盛りロケーターとフォーマッター#

各 Axis には、Axis オブジェクトに沿って目盛りを配置する場所を選択する目盛りロケーターフォーマッターがあります。これへの簡単なインターフェースは 次のset_xticksとおりです。

fig, axs = plt.subplots(2, 1, layout='constrained')
axs[0].plot(xdata, data1)
axs[0].set_title('Automatic ticks')

axs[1].plot(xdata, data1)
axs[1].set_xticks(np.arange(0, 100, 30), ['zero', '30', 'sixty', '90'])
axs[1].set_yticks([-1.5, 0, 1.5])  # note that we don't need to specify labels
axs[1].set_title('Manual ticks');
自動ティック、手動ティック
Text(0.5, 1.0, 'Manual ticks')

スケールが異なれば、ロケーターとフォーマッターも異なる場合があります。たとえば、上記の対数スケールでは と を使用LogLocatorしていLogFormatterます。他のフォーマッターとロケーター、および独自に作成するための情報については、ティック ロケーターティック フォーマッターを参照 してください。

日付と文字列のプロット#

Matplotlib は、日付の配列と文字列の配列、および浮動小数点数のプロットを処理できます。これらは、必要に応じて特別なロケーターとフォーマッターを取得します。日付の場合:

クイックスタート

詳細については、日付の例を参照してください (例: Date tick labels )

文字列の場合、カテゴリ プロットが得られます ( カテゴリ変数のプロットを参照してください)。

fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
categories = ['turnips', 'rutabaga', 'cucumber', 'pumpkins']

ax.bar(categories, np.random.rand(len(categories)));
クイックスタート
<BarContainer object of 4 artists>

カテゴリカル プロットに関する注意事項の 1 つは、テキスト ファイルを解析する一部の方法では、文字列がすべて数値または日付を表している場合でも、文字列のリストが返されることです。1000 個の文字列を渡すと、Matplotlib は 1000 個のカテゴリを意味すると見なし、プロットに 1000 個のティックを追加します!

追加の軸オブジェクト#

大きさの異なるデータを 1 つのグラフにプロットするには、追加の y 軸が必要になる場合があります。twinxこのような Axis は、 を使用して、非表示の x 軸と右側に配置された y 軸を持つ新しい Axes を追加することによって作成できます (同様にtwiny)。別の例については、異なるスケールのプロットを参照 してください。

同様に、メインの軸とは異なるスケールを持つsecondary_xaxisまたは を追加して、異なるスケールまたは単位でデータを表すことができます。さらなる例については、第 2 軸secondary_yaxisを参照 してください。

fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(7, 2.7), layout='constrained')
l1, = ax1.plot(t, s)
ax2 = ax1.twinx()
l2, = ax2.plot(t, range(len(t)), 'C1')
ax2.legend([l1, l2], ['Sine (left)', 'Straight (right)'])

ax3.plot(t, s)
ax3.set_xlabel('Angle [rad]')
ax4 = ax3.secondary_xaxis('top', functions=(np.rad2deg, np.deg2rad))
ax4.set_xlabel('Angle [°]')
クイックスタート
Text(0.5, 509.6660000000001, 'Angle [°]')

カラーマッピングされたデータ#

多くの場合、カラーマップの色で表されるプロットに 3 番目の次元が必要です。Matplotlib には、これを行う多くのプロット タイプがあります。

X, Y = np.meshgrid(np.linspace(-3, 3, 128), np.linspace(-3, 3, 128))
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)

fig, axs = plt.subplots(2, 2, layout='constrained')
pc = axs[0, 0].pcolormesh(X, Y, Z, vmin=-1, vmax=1, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[0, 0])
axs[0, 0].set_title('pcolormesh()')

co = axs[0, 1].contourf(X, Y, Z, levels=np.linspace(-1.25, 1.25, 11))
fig.colorbar(co, ax=axs[0, 1])
axs[0, 1].set_title('contourf()')

pc = axs[1, 0].imshow(Z**2 * 100, cmap='plasma',
                          norm=mpl.colors.LogNorm(vmin=0.01, vmax=100))
fig.colorbar(pc, ax=axs[1, 0], extend='both')
axs[1, 0].set_title('imshow() with LogNorm()')

pc = axs[1, 1].scatter(data1, data2, c=data3, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[1, 1], extend='both')
axs[1, 1].set_title('scatter()')
pcolormesh()、contourf()、imshow() と LogNorm()、scatter()
Text(0.5, 1.0, 'scatter()')

カラーマップ#

ScalarMappable これらはすべて、オブジェクトから派生したアーティストの例です。それらはすべて、vminvmaxの間の線形マッピングをcmapで指定されたカラーマップに設定できます。Matplotlib には、選択できる多くのカラーマップ (Matplotlib でカラーマップを選択する)があり、独自に作成する (Matplotlib でカラーマップを作成する) か、サードパーティ パッケージとしてダウンロードでき ます。

正規化#

LogNorm上記の例のように、カラーマップへのデータの非線形マッピングが必要な場合があります。これを行うには、 ScalarMappableにvminvmaxの代わりにnorm引数を指定します。その他の正規化は、カラーマップの正規化に示されています。

カラーバー#

を追加するcolorbarと、色を元のデータに関連付けるキーが与えられます。カラーバーは Figure レベルのアーティストであり、ScalarMappable (ノルムとカラーマップに関する情報を取得する場所) にアタッチされ、通常は親の Axes からスペースを盗みます。カラーバーの配置は複雑になる場合があります 。詳細については、カラーバーの配置を参照してください。また、 extendキーワードを使用してカラーバーの外観を変更 して端に矢印を追加したり、サイズを制御するために縮小および縦横比を変更したりすることもできます。最後に、カラーバーには標準に適したデフォルトのロケーターとフォーマッターがあります。これらは、他の Axis オブジェクトと同様に変更できます。

複数の図と軸の操作#

またはを複数回呼び出して、複数の Figure を開くことができます 。オブジェクト参照を維持することで、どちらの Figure にもアーティストを追加できます。fig = plt.figure()fig2, ax = plt.subplots()

複数の軸を追加する方法はいくつかありますが、最も基本的な方法は plt.subplots()上記で使用した方法です。を使用して、列または行にまたがる Axes オブジェクトを使用して、より複雑なレイアウトを実現できますsubplot_mosaic

fig, axd = plt.subplot_mosaic([['upleft', 'right'],
                               ['lowleft', 'right']], layout='constrained')
axd['upleft'].set_title('upleft')
axd['lowleft'].set_title('lowleft')
axd['right'].set_title('right');
左上、右、左下
Text(0.5, 1.0, 'right')

Matplotlib には、Axes を配置するための非常に洗練されたツールがあります: Arranging multiple Axes in a Figureおよび 複雑でセマンティックな図の構成を参照してください。

もっと読む#

その他のプロット タイプについては、プロット タイプAPI リファレンス、特に Axes APIを参照してください。

スクリプトの合計実行時間: ( 0 分 9.122 秒)

Sphinx-Gallery によって生成されたギャラリー