基本的な使い方
まずは、以下を import します。
1 2 3 |
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np |
基本的なグラフ
最も原始的なグラフを書きます。
1 2 |
fig, ax = plt.subplots() # ① ax.plot([1, 2, 3, 4], [1, 4, 2, 3]); # ② |
Matplotlib のグラフの構造ですが、画像のレイヤーのようにいくつかの画像を重ねて作られている、とするとイメージしやすいでしょう。まず Figure という土台、基本のウインドウ的なものを生成します。そしてその Figure の上に Axes という実際にグラフを描くための座標軸を持つ白紙を生成します。Figure の上には、複数の Axes を生成することもできます。
例:Figure の上に、3つの Axes
上記のコードの意味。
① 本来であれば Figure を生成して、その後 Axes 生成します。ただし、ほとんどの場合 Figure だけ生成して、Axes を作らない、ということはないので、Axes が一つの場合は、Figure と 一つの Axes を plt.subplots() で同時に生成できます。(plt.subplots() の引数()を指定すると、複数の Axes が生成されます。(後述))
② 白紙の Axes に数値をプロットしていきます。さきほど Matplotlib のグラフの構造は画像のレイヤーのようだ、と説明しましたが、この白紙の Axes に直接グラフを描く、というよりは、Figure → Axes の上に数値のプロットのレイヤーを更に重ねる、(Figure → Axes → プロットの3層)とイメージするといいでしょう。
②のax.plot([1, 2, 3, 4], [1, 4, 2, 3])では、
→ x = [1, 2, 3, 4],y = [1, 4, 2, 3]
→ (x, y) = (1,1),(2,4),(3,2),(4,3)
の4箇所の座標軸にプロットされ、特に指定がなければ座標軸から次の座標軸まで直線が引かれます。ということで先程のグラフが完成します。
グラフ再掲:
グラフの構造
・Figure と Axes は上記の通り。
・Title:グラフのタイトル
・Legend:line や marker の凡例
・Line:plot と plot を つなぐ線。直線や曲線。
・Markers:plot の形状
・grid:目盛線
・Spains:外枠線
・Major tick:主目盛り
・Minor tick:副、サブ目盛り
・Major tick label:主目盛りのラベル
・x, y axis label:x, y 軸のラベル
・Artist:グラフで表示されるものをすべて Artist と呼びます。
プロット関数へインプットできる型
プロット関数は、入力としてnumpy.arrayまたはnumpy.ma.masked_array、またはnumpy.asarrayに渡すことができるオブジェクトを想定しています。 pandasデータオブジェクトやnumpy.matrixなどの配列(「配列のような」)に類似したクラスは、意図したとおりに機能しない場合があります。一般的な規則は、プロットする前にこれらをnumpy.arrayオブジェクトに変換することです。ほとんどのメソッドは、dict、numpy.recarray、pandas.DataFrameなどのアドレス可能なオブジェクトも解析します。 Matplotlibを使用すると、dataキーワード引数を指定し、x変数とy変数に対応する文字列を渡すプロットを生成できます。
コーディングスタイル(Coding styles)
オブジェクト指向と pyplot スタイル
Matplotlib を使用するには基本的には2つの方法があります。
・オブジェクト指向スタイル
→ (the “object-oriented (OO:オーオー) style”)
Figure と Axes を作成し、それらに対してメソッドを呼び出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
x = np.linspace(0, 2, 100) # 0 から 2 までの間に要素数を 100個生成 fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained') # Figure と Axes を生成。 # Figure のサイズは(5×2.7)インチ ax.plot(x, x, label='linear') # Axes に座標(x, x)をプロットする。ラベルは linear とする。 ax.plot(x, x**2, label='quadratic') # Axes に座標(x, xの2乗)をプロットする。ラベルは quadratic とする。 ax.plot(x, x**3, label='cubic') # Axes に座標(x, xの3乗)をプロットする。ラベルは cubic とする。 ax.set_xlabel('x label') # Axes に x 軸のラベルを設置する。ラベルは x label とする。 ax.set_ylabel('y label') # Axes に y 軸のラベルを設置する。ラベルは y label とする。 ax.set_title("Simple Plot") # Axes に タイトルを設置する。ラベルは Simple Plot とする。 ax.legend(); # 凡例を設置する |
・pyplotスタイル
図形と軸を自動的に作成および管理するには pyplot を使用し、プロットには pyplot 関数を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
x = np.linspace(0, 2, 100) # 0 から 2 までの間に要素数を 100個生成 plt.figure(figsize=(5, 2.7), layout='constrained') # Figure を生成。 # Axes の生成は明示していないが、自動的に生成される「暗黙の」Axes にデータを設置していく。 plt.plot(x, x, label='linear') 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 の公式ドキュメントでも両方のスタイルを使用しています。違いとしては、オブジェクト指向の目的の一つに「データの再利用」「修正のしやすさ」が挙げられます。このサイトでは、基本的なグラフの作成には「オブジェクト指向スタイル」を使用し、視覚的な確認を目的とするときは pyplot スタイルを使用する、ということにします。
まとめ
Matplotlib の基本的な使い方と各構成要素の名前と意味を、紹介しました。次はこの各構成要素をカスタマイズしていく pyplot tutorial に続きます。