Matplotlib
は、pythonのグラフ描画ライブラリの代表格です。
Matplotlib
を使うと、次のようなことができます:
- 折れ線グラフや棒グラフなど様々な種類のグラフで、データを可視化
- パイチャートやバブルチャートなど、視覚的に魅力的なチャートを作成
- グラフを使ってアニメーションを生成
いろいろできて便利ですね。
しかし!!!はっきり言ってMatplotlib
は慣れるまでのハードルが高いです。
例えば、次のような感じで、いろいろな問題に直面します。
- そもそもどういう流れでプロットするかわからない!
- 軸も設定できないし、日本語も文字化けする、オブジェクト指向って何?!
この記事は、Matplotlib
初心者の方が、ある程度自由にグラフを描けるようになるためのガイドラインを目指しています。
初めは誰でも初心者です。一歩ずつ着実に学んでいって、Matplotlib
で自由にグラフ作成できるようになりましょう!
- Matplotlibとは?
- Matplotlibのインストール
- Matplotlibでグラフ作成する流れ
- グラフ周辺の表示設定
- 複数のグラフを表示
- 様々な種類のグラフ
- 日本語を表示できるようにする方法
- オブジェクト指向のグラフ描画へ
- アニメーション作成方法
- おわりに:Matplotlib解説記事リンク集の紹介
Matplotlibとは?
Matplotlib
とは、pythonのグラフ描画ライブラリです。
名前の由来は、MATLABユーザーが使用しやすいように設計されていることと関連があるそうです。
Matplotlibのインストール
Matplotlib
は、外部ライブラリなので使用環境によってはインストールが必要になります。
pip
を使用する場合:
コマンドプロンプトから次のコマンドでインストールしましょう。
pip install matplotlib
conda
を使用する場合:
デフォルトの環境を使用する場合は、プレインストールされているのでインストール不要です。
自分で新たに仮想環境を作成した場合はconda
でインストールしましょう。
conda install matplotlib
- Google Colaboratoryを使用する場合:
プレインストールされているのでインストール不要です。
とりあえずMatplotlib
を使いたいという方は、初期設定不要なGoogle Colaboratoryがおススメです。
Matplotlibでグラフ作成する流れ
基本的なグラフ描画の流れは次の通りです。
matplotlib
のインポート- データの準備
- グラフの作成・表示
慣れてくると、各ステップで細かい設定をしたり、複数のグラフを同時に描いたり、応用していくことになります。
それでも、基本の流れは変らないので、まずは基本形をマスターしましょう!
以下で、各ステップをサンプルコード付きで解説していきます。
①matplotlibのインポート
Matplotlib
では、基本的にpyplot
モジュールを使用してグラフを描きます。
import matplotlib.pyplot as plt
pyplot
モジュールは略称plt
でインポートするのが慣例です。
Jupyter Notebookの場合は、ノート内にグラフを表示させるために、マジックコマンドも実行します。
%matplotlib inline
import matplotlib.pyplot as plt
マジックコマンドの意味はわからなくてもOKですが、気になる方は次の記事をチェックしてください。
②データの準備
データは、array-like
で用意します。
array-like
には、次のような型(オブジェクト)が含まれます。
- Pythonの
リスト
:例x = [1, 2, 3]
- NumPyの
ndarray
:例y = np.array([15, 16, 17])
- Pandasの
DataFrame
やSeries
の値:例df = pd.DataFrame({"x":[0,1,2], "y":[15,16,17]})
ここでは例として、ndarray
でサインカーブを用意してみます。
import numpy as np
x = np.linspace(0, 2*np.pi)
y = np.sin (x)
matplolib
では、等間隔な数列を用意することがよくあります。
等間隔な数列の用意にはNumPy
のlinspace()
が便利です。
③グラフの作成、表示
matplolib
の最も基本的なグラフ描画関数plt.plot()
でグラフを描いてみましょう。
plt.plot(x, y) #x, yの配列から折れ線グラフを描く
変数名 | 型 | 説明 |
---|---|---|
x |
Array-like |
x座標の配列 |
y |
Array-like |
y座標の配列 |
最後にplt.show()
でグラフを表示します。
plt.plot(x, y)
plt.show()
デフォルト設定のplt.plot()
は、折れ線グラフを作成します。
追加の引数でプロットの形を指定したり、色を指定したりすることができます。
plt.plot(x,y,"r*", markersize=10)
plt.show()
plt.plot()
の基本的な使い方について、一通り知りたい方は次の記事を参考にしてください。
プロットや線のスタイルの変更、グラフタイトルや軸ラベルの設定について全体的に解説しています。
グラフ周辺の表示設定
ここでは、次の項目の基本的な設定方法を紹介します。
- グラフタイトル
- 軸ベル
- 凡例
グラフタイトル|plt.title()
plt.title()
でグラフにタイトルを設定できます。
- 使用例:
plt.title("Title of Figure")
plt.title("sine curve")
plt.plot(x, y)
plt.show()
追加のキーワード引数でタイトルのスタイルを変更できます。
plt.title("sine curve", size = 20, color = "red")
plt.plot(x, y)
plt.show()
フォント設定はplt.text()
の設定とほぼ同じなので、詳細はplt.text()
の記事を参照してください。
軸ラベル|plt.xlabel(), plt.ylabel()…
軸ラベルの主要な設定項目一覧表はこちらです。
表示項目 | 関数名 |
---|---|
x軸ラベル | plt.xlabel("x軸ラベル名") |
y軸ラベル | plt.ylabel("y軸ラベル名") |
x軸の最大・最小値 | plt.xlim(最小値, 最大値) |
y軸の最大・最小値 | plt.ylim(最小値, 最大値) |
目盛り線 | plt.grid() |
各関数の実行例を紹介します。
plt.plot(x, y)
plt.xlabel("X-value") # x軸ラベルの設定
plt.ylabel("Y-value") # y軸ラベルの設定
plt.xlim(0, 2*np.pi) # x軸の最大・最小値設定
plt.ylim(-1.5, 1.5) # y軸の最大・最小値設定
plt.grid() # グリッド線の表示
plt.show()
軸周りの設定用関数については、次の記事で解説しています。
凡例|plt.legend()
Matplotlib
で凡例を表示させるには、次の2ステップを踏みます。
- プロット作成時にラベル名を指定:
plt.plot(x, y, label='label_name')
- 凡例を表示:
plt.legend()
サインカーブのグラフに凡例を表示してみます。
plt.plot(x, y, label="sin(x)")
plt.legend()
plt.show()
凡例の位置やスタイルの設定に関する詳しい内容は、次の記事を参考にしてください。
複数のグラフを表示
複数のグラフ(曲線)を表示する場合には、次の2通りの方法があります。
- 同一のグラフ内に複数の曲線を作成|
plt.plot()
繰り返し - 複数のグラフ領域を並べて配置|
plt.subplot()
でプロット領域指定
それぞれの方法を確認していきましょう。
同一のグラフ内に複数の曲線を作成
plt.plot()
を繰り返して実行すると、同一グラフ内に複数の曲線を追加することができます。
plt.plot(x1, y1) # 1つ目の曲線のx, yの配列
plt.plot(x2, y2) # 2つ目の曲線のx, yの配列
実際にsinカーブとcosカーブを描いてみましょう。
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label="sin")
plt.plot(x, y2, label="cos")
plt.legend()
plt.show()
plt.plot()
を繰り返せば、グラフ内に必要なだけ曲線を生成できます。
複数のグラフを並べて配置|plt.subplot()
plt.subplot()
を使うと、一つの図の中に複数の小さなプロット(サブプロット)を配置することができます。
プロットを作成する前に、plt.subplot()
を使用してサブプロットの作成場所を指定します。
plt.subplot(LMN)
引数 | 入力値 | 説明 |
---|---|---|
L |
一桁の正数 | 図を縦にL 個に分割 |
M |
一桁の正数 | 図を横にM 個に分割 |
N |
一桁の正数 | 左上から数えてN 番目の領域を指定 |
例えば、縦に2分割(L = 2
)、横に3分割(M = 3
)した場合の、各サブプロットの場所は下図のようになります。
例として、2つプロットを横方向に並べてみます。
# 図のサイズを決める
plt.figure(figsize=(8,4), tight_layout=True)
# 1つ目のグラフ
plt.subplot(121)
plt.plot(x, y1)
# 2つ目のグラフ
plt.subplot(122)
plt.plot(x, y2, 'r--')
plt.show()
サブプロットの詳しい解説はこちらの記事を参考にしてください。
Matplotlib
では描画領域はFigure
オブジェクト、各プロット領域はAxes
と呼ばれるオブジェクトで構成されています。
FigureとAxesは、後述するオブジェクト指向のグラフ描画の入り口です。まずは次の記事で2つの関係をチェックしてください
様々な種類のグラフ
Matplotlib
では、折れ線グラフ以外にも様々なグラフを作成できます。
各グラフを描くための関数、解説記事のサマリー表はこちらです。
グラフの種類 | plt.関数名() | 解説記事 |
---|---|---|
折れ線グラフ、プロット | plt.plot() |
≫【完全保存版】matplotlib pyplot徹底解説 |
棒グラフ、積み上げ棒グラフ | plt.bar() |
≫棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK |
円グラフ、ドーナツグラフ | plt.pie() |
≫円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説 |
散布図、バブルチャート | plt.scatter() |
≫散布図を徹底解説!|基本設定からバブルチャートまで |
ヒストグラム、累積分布関数 | plt.hist() |
≫ヒストグラム徹底攻略!|作成も見た目の設定も全解説 |
円や多角形などの図形 | patches モジュール |
≫Matplotlib 図形を描く方法|円や四角形の描き方をわかりやすく解説 |
以下では、簡単な各グラフの簡単な例を紹介します。詳しくは個別の解説記事を参照してください。
棒グラフ|plt.bar()
棒グラフはplt.bar()
で作成します。
棒の高さheight
だけではなく、棒の位置x
も設定する必要があるという特徴があります。
x = [1, 2, 3, 4]
height = [10, 20, 30, 40]
labels = ["Apple", "Banana", "Carrot", "Daikon"]
plt.bar(x, height=height, tick_label=labels)
plt.show()
円グラフ|plt.pie()
円グラフはplt.pie()
で作成します。
見慣れた円グラフ(要素が0時の位置から始まって右回りのグラフ)を作成するには、引数で角度や方向を設定する必要があります。
x = [30, 20, 15, 5]
labels = ["Apple", "Banana", "Carrot", "Daikon"]
plt.pie(x, labels=labels, startangle=90, counterclock=False)
plt.show()
図
散布図|plt.scatter()
散布図はplt.scatter()
で作成します。
各プロットに色を付けたり、大きさを変更したりすることができます。
x = np.random.randn(25)
y = np.random.randn(25)
colors = np.random.rand(25)
plt.scatter(x, y, c=colors, cmap="winter")
plt.show()
ヒストグラム|plt.hist()
ヒストグラムはplt.hist()
で作成します。
ヒストグラムの要素の区切りの間隔を自動で設定することもできます。
x = np.random.randn(10000)
plt.hist(x, bins="auto", alpha=0.6, edgecolor="gray")
plt.show()
その他にも確率密度関数や累積分布関数の作成もできます。詳しくは次の記事を参考にしてください。
円や多角形などの図形|patchesモジュール
Matplotlib
ではpatches
というモジュールに、様々な図形のクラスが用意されています。
図形の描画には、オブジェクト指向のグラフ描画が必須です。
Axes
オブジェクトに図形オブジェクトを追加して、図形を表示させます。
from matplotlib import patches
fig, ax = plt.subplots(figsize=(4,4))
ax.axis([2, 7, 0, 5]) # 軸の設定
ax.grid()
# 円を描く
c = patches.Circle( (4.5,3.5), 1, facecolor="pink", edgecolor="red", label="circle")
ax.add_patch(c)
# 多角形を描く
for i in range(3, 7):
rp = patches.RegularPolygon( (i, 1) , i, 0.5, color="green", alpha=i*0.1)
ax.add_patch(rp)
plt.show()
円や楕円、多角形に他にも矢印の形など様々な図形を描くことができます。
日本語を表示できるようにする方法
Matplotlib
は、デフォルト設定では日本語は表示できず、▯▯▯
と表示されてしまいます。
日本語を使いたい場合には、plt.rcParams['font.family']
に日本語対応フォントを指定します。
日本語対応フォントの例は次の通りです。
'MS Gothic'
'MS Mincho'
'Meiryo'
例として、'MS Gothic'
を指定してみます。
plt.rcParams['font.family'] = 'MS Gothic'
plt.plot()
plt.title("グラフタイトル")
plt.xlabel("x軸ラベル名")
plt.ylabel("y軸ラベル名")
plt.text(0.5, 0.5,"テキスト例")
plt.show()
この他にも、fontname
を指定する方法や設定ファイルを書き換える方法があります。
オブジェクト指向のグラフ描画へ
plt.XXX()
を使用したグラフ描画は簡単で便利です。
しかし、次のステップへ行くにはオブジェクト指向でグラフ描画できるようになる必要があります。
オブジェクト指向の第一歩は、基本パーツFigure
とAxes
の関係性を把握することです。
Figure
:描画領域全体Axes
:一つ一つのプロットを描く領域
オブジェクト指向でグラフ描画する場合には、plt.subplots()
という便利な関数を使ってFigure
とAxes
オブジェクトを同時に生成することが多いです。
その後、Axes
オブジェクトのメソッドでグラフを追加していきます。
fig, axes = plt.subplots(2, 2, tight_layout=True, sharex=True, sharey=True)
x = np.linspace(-3,3)
y = x**2
axes[0,0].plot(x, y)
axes[0,1].plot(x, 2*y)
axes[1,0].plot(x, 3*y)
axes[1,1].plot(x, 4*y)
plt.show()
この例では、sharex
, sharey
という引数を使用して、サブプロット間で軸を共有しています。
オブジェクト指向を使うと、こういった細かい設定もできるようになります。
plt.subplots()
を使用したオブジェクト指向グラフ描画は次の記事を参考にしてください。
アニメーション作成方法
Matplotlib
でアニメーションを作成するには、matplotlib.animation
モジュールのクラスを使用します。
ArtistAnimation
クラスかFuncAnimation
クラスを使いますが、それぞれ次のような特徴があります。
ArtistAnimation
クラス:- 事前にグラフ要素を複数作成
- それらを組み合わせてアニメーションにする
FuncAnimation
クラス:- 事前にグラフ更新用関数を作成
- 関数を実行しながらアニメーションにする
ここでは、より簡単なArtistAnimation
を使用したサンプルコードを紹介します。
# 1. 必要なモジュールの読み込み
# %matplotlib notebook # Jupyter notebookの場合
from matplotlib.animation import ArtistAnimation
# 2.グラフ領域の作成
fig, ax = plt.subplots()
# 3. グラフ要素のリスト(artists)作成
artists = []
for i in range(100):
x = np.linspace(0, 4*np.pi)
y = np.sin(x - i/100 * 2*np.pi)
artist = ax.plot(x, y,"blue")
artists.append(artist)
# 4. アニメーション化
anim = ArtistAnimation(fig, artists)
plt.show()
ArtistAnimation
およびFuncAnimation
クラスの詳しい解説は次の記事を参照してください。
おわりに:Matplotlib解説記事リンク集の紹介
この記事は、Matplotlib
初心者の方が、ある程度自由にグラフを描けるようになるためのガイドラインを目指しています。
初めは誰でも初心者です。一歩ずつ着実に学んでいって、Matplotlib
で自由にグラフ作成できるようになりましょう!
Matplotlib
カテゴリーの記事一覧はこちらです。>>【ブログカテゴリー:Matplotlib】
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!