Lesson3

Matplotlibの使い方(グラフ描画)

1. 学習の目標

このセクションでは Matplotlib を使ったグラフの作り方について学びます。

plt_00.png

代表的なグラフの作り方をひととおり見てみてください。

  • グラフの基本(折れ線グラフの作り方)
  • 代表的なグラフの描き方
  • 複数のグラフを一度に表示する方法
  • 応用例:近似直線の描き方

2. グラフの基本(折れ線グラフの描き方)

早速、グラフを作成しましょう。ここでは基本的なグラフの描き方を「折れ線グラフ」で学びます。

Matplotlibを使ってグラフを描くときの流れは以下のとおりです。

  1. matplotlib.pyplot をモジュールとしてインポートする
  2. グラフ化するデータを用意する
  3. グラフを作成する
  4. 作成したグラフを表示する(JupyterLabでは自動で表示)

ひとつずつ実行していきましょう。

2.1 matplotlib.pyplotのインポート

まずは matplotlib.pyplot をモジュールとしてインポートします。

JupyterLabで新規ノートブックを作成し、Lesson3 という名前にしてください。そうしたら、下記の命令を実行します。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

%matplotlib inline は、Pythonファイルを作成して実行する場合は不要ですが、JupyterLabを使ってブラウザ上にグラフを表示したい場合は必須です。次の import とセットで覚えておきましょう。

import matplotlib.pyplot as plt を実行することで、matplotlib.pyplot モジュールを plt という名前で利用できますので、各種メソッドは plt.メソッド名() のように記述すればOKです。

また、このレッスンでもNumPyを利用しますので、import numpy as np もあわせて実行しておいてください。

2.2 グラフ化するデータを用意する

次に、グラフ化したいデータをリスト、もしくはndarray形式で用意します。

ここでは、np.random.rand() を使ってランダムな数値を5個もった配列を生成します。また、各要素は、randで生成後、5倍にしています。

y = np.random.rand(5)
y *= 5

2.3 グラフを作成する

グラフを作成します。そのためには plt.plot() を実行します。引数には、表示したいデータの配列を指定してください。

plt.plot(y)

JupyterLabでは、ここまででグラフがブラウザ上に表示されます。(ランダムな数の配列をグラフ化していますので、出力結果は下記の例と異なるはずです。また、左側の数値が [11] となっている点について、ご自身のものと表示が違っていても気にしないでください。)

出力結果:

plt_01.png

2.4 横軸のデータも用意する

先ほどの折れ線グラフは、縦軸が用意した配列となっていますが、横軸は配列のインデックス(0番目、1番目、2番目、…)です。そうではなく、指定した値を横軸にしたい場合は、横軸用の配列を別途用意してください。

x = np.arange(1, 11, 2)
y = np.random.rand(5)
y *= 5
plt.plot(x, y)

出力結果:

plt_02.png

上記の場合、横軸は np.arange(1, 11, 2) としたので [1, 3, 5, 7, 9] の配列です。縦軸は、ランダムな数の要素が5個ある配列(各要素を5倍にしたもの)です。横軸もグラフに指定する際は、plt.plot(横軸の配列, 縦軸の配列) としてください。「要素の位置の数字が同じもの」を横と縦のペアにして、グラフ上の座標に打点されます。

2.5 グラフのスタイルを変更する

グラフの線の種類や点の記号、色を変更する際は plot() にキーワード引数を追加してください。

スタイル キーワード引数 使用例 その他の主な設定値
線の種類 linestyle linestyle = "--"(破線) "-"(実線), "-."(一点鎖線), ":"(点線)
点の記号 marker marker = "^"(上向きの三角形) こちらのページ(英語)の表を参考にしてください
線の色 color color = "r"(赤) "g"(緑), "b"(青), "y"(黄), "k"(黒)

先ほどのxとyを使ったグラフに、さまざまな値でパラメータを設定して、表示内容を見てみましょう。

plt.plot(x, y, linestyle = "--", marker = "^", color = "r")

出力結果:

plt_03.png

これらの設定は plt.plot() を実行することでクリア(削除)されるので、plt.plot() を実行する前に毎回指定してください。

2.6 グラフの部品を追加する

グラフのタイトルや縦軸・横軸のラベル、目盛り線を追加したいときは、pyplot がもつ各種メソッドから情報を設定してあげる必要があります。

部品名 メソッド 利用例
グラフタイトル title() plt.title("Year - Count")
横軸のラベル xlabel() plt.xlabel("Year")
縦軸のラベル ylabel() plt.ylabel("Count")
目盛り線 grid() plt.grid(True)

以下のサンプルを実行確認してみましょう。

x = np.array([2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017])
y = np.array([400, 300, 350, 450, 400, 600, 500, 450])

plt.title("Year - Count")
plt.xlabel("Year")
plt.ylabel("Count")
plt.grid(True)

plt.plot(x, y)

出力結果:

plt_04.png

これらの部品の設定はグラフを表示するごとにクリア(削除)されるので、グラフ描画の際に欲しいときは必ず指定してください。

3. 代表的なグラフの描き方

ここでは代表的なグラフと基本的な描画方法を紹介します。以下はそれぞれ簡単な使い方の説明となっていますが、さきほどのチャプターで説明した color などのキーワード引数やラベルなどの設定方法も使えます。

3.1 棒グラフ

棒グラフには縦の棒グラフと横の棒グラフが存在します。縦の棒グラフは plt.bar() 、横の棒グラフは plt.barh() を使ってください。引数には、縦棒グラフでいうと、1つ目が横軸のデータ(グラフの項目)で2つ目は縦軸になるデータ(棒の長さになるもの)を指定します。

縦の棒グラフの例

year = np.array([2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017])
count = np.array([400, 300, 350, 450, 400, 600, 500, 450])

plt.bar(year, count)

出力結果:

plt_05.png

横の棒グラフの例

year = np.array([2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017])
count = np.array([400, 300, 350, 450, 400, 600, 500, 450])

plt.barh(year, count)

出力結果:

plt_06.png

3.2 散布図

散布図は plt.scatter() で描きます。引数には、1つ目が横軸、2つ目が縦軸になるデータを指定します。

english = np.array([70, 95, 83, 100, 72, 71, 75, 85, 67, 75])
math = np.array([90, 82, 100, 95, 50, 81, 52, 56, 67, 71])

plt.scatter(english, math)

出力結果:

plt_07.png

3.3 円グラフ

円グラフは plt.pie() で作成します。引数には、グラフとして表示したいデータを指定します。

fruits = np.array(["peach", "orange", "grape", "banana", "apple"])
count = np.array([12, 20, 34, 36, 47])

plt.pie(count, labels = fruits, autopct = "%.1f%%", startangle = 90)

出力結果:

plt_08.png

いくつかキーワード引数を追加しました。labels は各要素のラベル(配列かリスト形式)、autopct はデータの書式設定(ここで指定した %.1f%% は小数点以下が1桁でパーセント記号を表示するという指定です。%% としているのは%をパーセント記号として表示するためのものでエスケープと呼んでいます)、startangle は円グラフを開始する角度で、時計でいう3時の方向を0度として反時計回りに何度か、という指定をします。このキーワードには90と指定したので、時計でいう12時の方向から反時計回りにグラフを描きます(そのため、要素の順序に注意してください)。

4. 複数のグラフを一度に表示する方法

4.1 ひとつのグラフ領域に複数のグラフを描く

たとえば、ひとつのグラフ領域に青い線のグラフと赤い線のグラフを描くなら、plt.plot() を続けて指定すればOKです。

y1 = np.random.rand(11)
y2 = np.random.rand(11)

plt.plot(y1, color="blue", label = "y1")
plt.plot(y2, color="red", label = "y2")
plt.legend(loc = "upper left")

np.random.rand() を使ってデータを取得しているので、実行結果は毎回異なります。

出力結果:

plt_09.png

plt.legend() は、それぞれの線が何のデータを示しているかを表す「凡例」をグラフに表示するためのメソッドです。これを利用するためには、plt.plot()label というキーワード引数を追加しなければなりません。ここでは単純に "y1", "y2" としました。

また loc のキーワード引数は凡例の表示位置を指定します。"upper left" は左上です。

4.2 複数のグラフを並べて表示する

先ほどのものとは違い、複数のグラフ画像を作成して横並びにするなら plt.figure() を実行して matplotlib.figure.Figure 型のオブジェクトを生成します。次に、そのオブジェクトに add_subplot で描画領域を指定した上でグラフ画像を追加し、最後にオブジェクトを表示させます。

y1 = np.random.rand(11)
y2 = np.random.rand(11)

fig = plt.figure()

sp1 = fig.add_subplot(1, 2, 1)
sp1.plot(y1)

sp2 = fig.add_subplot(1, 2, 2)
sp2.plot(y2)

出力結果:

plt_10.png

上記のサンプルでは、横並びで2つのグラフを表示させました。add_subplot(a, b, c) の引数は3つあり、最初の2つ(aとb)は「縦a行、横b列」のグラフ表示領域を作成するという命令です。先ほどは 1, 2 と指定したので、横に2つ並べるという前提で表示領域を用意しました。そして3つ目の引数(c)で何番目の領域にグラフを表示するかを指定します。

もちろん、aに2以上の数値を入れれば、縦にグラフを並べることもできます。a, b, cの値を色々と変えてプログラムを実行し、出力結果を確認してみましょう。

5. 応用例:近似直線の描き方

応用例として散布図のグラフに近似直線を描いてみましょう。ここでは近似直線の求め方として「最小二乗法」を採用します。最小二乗法については、こちらのページを参照してください。

最小二乗法 - Wikipedia

NumPyでは、最小二乗法による近似直線(一次関数)の式 y = ax + b を簡単に導出できるメソッドが用意されています。np.polyfit() です。引数は3つあり、左から「xに該当するデータ」「yに該当するデータ」「一次式であることを指定する 1」です。こちらを用いることで、近似直線の式 y = ax + bab を求めることができます。

# サンプルデータ
x = np.array([20, 30, 40, 50, 60])
y = np.array([30, 38, 41, 49, 62])

# 近似直線の式の a と b が入ったタプルを得る
p = np.polyfit(x, y, 1)

# 一次関数の式のオブジェクトを生成する
f = np.poly1d(p)

# 散布図と近似直線を描く
plt.scatter(x, y)
plt.plot(x, f(x))

np.polyfit() の引数は3つ。最初と2番目は、それぞれ横軸と縦軸のデータの配列です。3つ目は、一次関数の式を出したいので「一次」の1を指定します。このメソッドの戻り値は y = ax + b のうち ab の値が入ったタプル形式のデータです。

np.polyfit() のあとで np.poly1d() というものを実行しています。これは一次関数の式のオブジェクトを生成します。a * x + b と自分で式を記述しても良いですが、これにより、plt.plot(x, f(x)) と記述したように f(x) と書くだけで一次関数の式を扱えるので便利です。セットで覚えておきましょう。

上記プログラムの実行結果を下記に掲載します。

出力結果:

plt_11.png

6. まとめ

このレッスンではグラフを描画するライブラリである「Matplotlib」の基本的な使い方について学びました。データを分析した結果をグラフで表示する機会は多くありますので、今後のPythonプログラミングではほぼ必須のライブラリです。ぜひ、たくさんグラフを作成しましょう。

次のレッスンではデータ解析が便利になる「Pandas」というライブラリを紹介します。

Lesson4 Pandasの使い方(データ解析)へ進む
Copyright 2020 SAKURA Internet Inc. All rights reserved