3.

matplotlib の基本

3.1 matplotlib の動かし方
matplotlib を動かすには、IPython などが必要です。既にインストールが済んでいるので使ってみましょう。端末で ipython3 --pylab と入力すると IPython
が pylab モードで立ち上がります。この状態で IPython は matplotlib GUI バッ
クエンドが有効になります。
matplotlib を動かすのに必要な Matplotlib API 関数は、matplotlib.pyplot モ
ジュールに含まれています。次のようにインポートしておくと、以降は plt として参照できるようになります。
In [1]: import matplotlib.pyplot as plt
新たな図を作成するために、plt.figure を使います。
In [2]: fig = plt.figure()
空のウィンドウが現れます。この状態ではまだプロットできないので、
add̲subplot を使いプロット領域を作成する必要があります。
In [3]: ax = fig.add̲subplot(1, 1, 1)
図３­１­１のような空の１つのサブプロットを持ったウィンドウが作成されます。plt.savefig(ファイル名)を使って、プロットを保存することもできます。
現在、eps、jpeg、jpg、pdf、pgf、png、ps、raw、rgba、svg、svgz、tif、tiff、
webp に対応しており、ファイル名の拡張子を判断して自動で変換されます。
In [4]: plt.savefig("subplot.png")図３−１−１

matplotlib のウィンドウに空のサブプロットを追加

In [5]: quit()
で IPython を終了します。
plt.savefig には表３­１­１のようなオプションがあり、例えば解像度を 300
dpi に変えられます。
plt.savefig("subplot.png", dpi=300)
また、図３­１­１のような周囲の余白を少なくするには、オプションとしてbbox̲inches='tight'を指定します。
表３−１−１

plt.savefig の主要オプション

なお ipyhon が pylab モードでない場合（ipython3 のみで起動した場合）、

plt.show()を行うまでは図が表示されません。そのため、先ほどの手続きが次のように変わります。
In [1]: import matplotlib.pyplot as plt
In [2]: fig = plt.figure()
In [3]: ax = fig.add̲subplot(1, 1, 1)
In [4]: plt.show()In [5]: quit()3.2 関数グラフの作成
まだグラフを描いていないので、次は簡単なグラフを作ってみます。もう一度 ipython3 --pylab で IPython を起動してみます。
In [1]:

import matplotlib.pyplot as plt

In [2]: fig, ax = plt.subplots()
先ほどとは違う書式ですが、ウィンドウを生成し空のサブプロットを生成する所までを同時に行ってくれます。関数などのグラフを作る時に便利なのがNumPy です。Numpy は Python において数値計算を効率的に行うための拡張モジュールで、関数や配列などを扱うことができ多くの数学関数、統計関数が用意されています。Numpy を利用する場合、次のように import します。
In [3]: import numpy as np
それでは、Numpy を使って cos(x)を作図してみましょう。np.linspace は、
線形に等間隔な数列を生成する関数です。円周率を返す np.pi と組み合わせてplt.plot を使い[­π, π]で作図します(図３­２­１)。
In [4]: x = np.linspace(-np.pi, np.pi)
In [5]: plt.plot(x, np.cos(x), color='k', ls='-', label='cos(x)')

図３−２−１

サブプロットに cos(x)をプロットしたもの

plt.plot(x, np.cos(x))でも動きますが、後ろに付けた color='k', ls='-'がオプシ
ョンで、それぞれ色（黒）、線種（実線）を意味しています。最後の label='cos(x)'は凡例のラベルで、後ほど説明します。color には図３­２­２のような色指定が可能で、color='k'と c='k'、color='red'、c='red'のいずれも同じです。指定可能な色の一覧を図３­２­３に載せておきます。どうしても自分で色を作りたい場
合は、color='#d62728'のように、'#rrggbb'の書式で RGB の０〜255 の値を２桁の 16 進数で入力します。

図３−２−２

matplotlib の⾊指定。⾚なら color="r"、または c="r"のように指定する

図３−２−３

matplotlib で指定可能な⾊の⼀覧

https://pythondatascience.plavox.info/wp-content/uploads/2016/06/colorpalette.png

今の図に sin(x)も重ねてみます。
In [6]: plt.plot(x, np.sin(x), color='r', ls='--', label='sin(x)')
sin(x)を描く際に、ls='--'で線種を破線に変えています。線種として使用可能なものを表３­２­１にまとめました。線を区別するために plt.legend で凡例も追加します（図３­２­４）。
In [7]: plt.legend(loc='best')
表３−２−１

matplotlib の linestyle で指定可能な線種⼀覧

図３−２−４さらに sin(x)もプロットし、凡例も追加したもの

凡例の場所は loc='best'では自動指定ですが、loc='upper left'のように強制的に位置を指定することも可能です（図３­２­５）。

図３−２−５plt.legend で指定可能な位置。他に best で⾃動指定も可能

3.3 グラフにマーカーを追加する
これだけでは物足りないので、グラフにマーカーを追加する方法を考えていきます。まずは、これまでと同じように python3 --pylab を起動してサブプロッ
トを作成し[­π, π]の範囲を作成します。
In [1]: import matplotlib.pyplot as plt
In [2]: fig, ax = plt.subplots()
In [3]: import numpy as np
In [4]: x = np.linspace(-np.pi, np.pi)
グラフにマーカーを追加してみます（図３­３­１）。np.tanh(x)で tanh(x)を作図します。marker='x'で 印のマーカーが付きます。
In [5]: plt.plot(x, np.tanh(x), color='k', ls='-', label='tanh(x)', marker='x')

図３−３−１tanh(x)のグラフに×印のマーカーを追加

さ ら に tan-1(x) を 青 色 で 重 ね て み ま す （ 図 ３ ­ ３ ­ ２ ）。 marker='o',fillstyle='none'で open circle になります。
In [6]: plt.plot(x, np.arctan(x), color='b', ls='-', label='arctan(x)', marker='o',fillstyle='none')

図３−３−２

図３−３−１にさらに⻘⾊で tan-1(x)を重ねたもの

matplotlib では数多くのマーカーが用意されています（表３­３­１）。

表３−３−１

matplotlib で指定可能なマーカーの⼀覧

marker='o'では塗りつぶしを変えることもできるので試してみましょう。まず marker='oʼ, fillstyle='full'で closed circle にしてみます。
In

[7]:

plt.plot(x,np.arccosh(x),color='r',

ls='-',

label='arccosh(x)',marker='oʼ, fillstyle='full')
ちょっと変わったマーカーを付けることもでき、marker='o', fillstyle='left'とすれば、左側だけ塗り潰せます（図３­３­３）。
In [8]: plt.plot(x, np.arcsinh(x), color='c', ls='-', label='arcsinh(x)', marker='o',fillstyle='left')
In [9]: plt.legend(loc='best')

図３−３−３

図３−３−２に cosh-1(x)と sinh-1(x)を重ね、凡例も付けた

他にも様々な塗りつぶしオプションがあるので一覧にしました（表３­３­２）。
表３−３−２

matplotlib の fillstyle で指定可能な塗り潰しオプション⼀覧

3.4 複数のグラフを並べる
これまでは、ウィンドウに１つのサブプロットのみでしたが、グラフを並べて表示したいこともあるでしょう。サブプロットは複数配置可能ですので、試してみましょう。fig.add̲subplot を使い縦に２つの図を並べてみます。
In [1]: import matplotlib.pyplot as plt
In [2]: fig = plt.figure()
In [3]: ax1 = fig.add̲subplot(2, 1, 1)
In [4]: ax2 = fig.add̲subplot(2, 1, 2)
fig.add̲subplot の最初の引数が縦に並べる数、２つ目が横に並べる数、３つ目がサブプロットのうちの何番目に当たるかを表します。ax1 が上のサブプロ
ット、ax2 が下のサブプロットに対応します。それぞれのサブプロットに図を描
くには、ここで定義した ax1、ax2 を使います。
これまでのように[­π, π]の範囲を作成し、上のサブプロット ax1 に sinh(x)を描き凡例を追加してみます（図３­４­１）。サブプロットを指定して描く場合
は、先ほどの plt.plot の代わりに ax1.plot のように指定します。凡例についても同様で、plt.legend の代わりに ax1.legend を使います。
In [5]: import numpy as np
In [6]: x = np.linspace(-np.pi, np.pi)
In [7]: ax1.plot(x, np.sinh(x), color='b', ls='-', lw=6, label='sinh(x)')
In [8]: ax1.legend(loc='best')
線がこれまでより太いのが分かると思います。lw=6 と指定したためです（デフォルトは lw=1）。lw=6 の代わりに linewidth=6 としても同じです。下のサブ

プロット ax2 に cosh(x)を描き凡例を追加してみます（図３­４­２）。ls=''とす
れば、線が消えてマーカーのみになります。marker='x', ms='3'で 印で大きさ3 のマーカーを追加します（デフォルトは ms=6）。markersize=3 としても同じ
です。
In

[9]:

ax2.plot(x,np.cosh(x),color='r',

ls='',

marker='x',ms='3',

label='cosh(x)')
In [10]: ax2.legend(loc='best')

図３−４−１

matplotlib のウィンドウに２つのサブプロットを追加し、上のサブプロッ

トに sinh(x)を描き凡例を追加した

図３−４−２下のサブプロットに cosh(x)と凡例を追加

１つのウィンドウに４つのサブプロットを追加することもできます。
In [1]: import matplotlib.pyplot as plt
In [2]: fig = plt.figure(figsize=(9, 6))
これまでとは異なり、plt.figure でウィンドウを作成する際に figsize=(9, 6)で大きさを指定しました。このようにすれば図の（横、縦）のサイズを指定することが可能です。ウィンドウの中にサブプロットを作成します。
In [3]: ax1 = fig.add̲subplot(2, 2, 1)
ウィンドウの左上に図が出てきます。３つ目の引数の１番目が左上、２番目
が右上、３番目が左下、４番目が右下に対応します。サブプロットの(0.4、0.4)の位置に plt.text でテキストを書いてみます。一番目の引数が横の位置、二番目の引数が縦の位置、３番目の引数がテキストで、fontsize=20 で文字の大きさを指定できます。
In [4]: plt.text(0.4, 0.4, "(2,2,1)", fontsize=20, color='k')Out[4]: Text(0.4,0.4,'(2,2,1)')
右上のサブプロットを追加し、rotation=30 で 30 度回転させてみます。
In [5]: ax2 = fig.add̲subplot(2, 2, 2)
In [6]: plt.text(0.4, 0.4, "(2,2,2)", rotation=30, fontsize=20, color='k')Out[6]: Text(0.4,0.4,'(2,2,2)')
左下にサブプロットを追加し、横にちょっとずらして（0.2、0.4）に配置します。新たに出てきた alpha=0.7 は不透明度を指定する引数で、0 が透明、1 が不透明です（デフォルトは 1）。
In [7]: ax3 = fig.add̲subplot(2, 2, 3)
In [8]: plt.text(0.2, 0.4, "(2,2,3)", fontsize=20, color='k', alpha=0.7)
Out[8]: Text(0.2,0.4,'(2,2,3)')
右下にもサブプロットを追加します（図３­４­３）。
In [9]: ax4 = fig.add̲subplot(2, 2, 4)
In [10]: plt.text(0.2, 0.4, "(2,2,4)", fontsize=20, color='k')Out[10]: Text(0.2,0.4,'(2,2,4)')

図３−４−３ウィンドウに４つのサブプロットを追加した

図に x * sin(x)のグラフを追加してみます。オプションとして追加した
drawstyle='default'は、これまでも使用してきたデフォルト設定の折れ線グラフです。
In [11]: import numpy as np
In [12]: x = np.linspace(-np.pi, np.pi)
In [13]: ax1.plot(x, x * np.sin(x), color='r', ls='--', drawstyle='default')
Out[13]: [<matplotlib.lines.Line2D at 0x117cf0160>]
他に３種類の設定が使えるので、ax2〜ax4 に並べてみます（図３­４­４）。
ax2：drawstyle='steps-post'：階段状（後側）
ax3: drawstyle='steps-pre' または 'steps'：前側
ax4：drawstyle='steps-mid'：中央In [14]: ax2.plot(x, x * np.sin(x), color='r', ls='-', drawstyle='steps-post')

Out[14]: [<matplotlib.lines.Line2D at 0x118141048>]
In [15]: ax3.plot(x, x * np.sin(x), color='r', ls='-', drawstyle='steps-pre')Out[15]: [<matplotlib.lines.Line2D at 0x1181509b0>]
In [16]: ax4.plot(x, x * np.sin(x), color='r', ls='-', drawstyle='steps-mid')Out[16]: [<matplotlib.lines.Line2D at 0x1183b07b8>]
３種類の階段状のグラフは、よく見ないと違いが分かりませんが、グラフの両端をみると、前側、後側、両方、のいずれに飛び出しているかが違っています。

図３−４−４x*sin(x)のグラフ。drawstyle を変えて並べた

最後に折れ線グラフで使用できるオプション一覧を表３­４­１にまとめておきます。

表３−４−１

matplotlib の pyplot.plot のオプション⼀覧

使⽤⽅法：plt.plot(x, y)、plt.plot(x, y, オプション)

3.5 グラフの体裁を整える
グラフを作図した際にサイズを調整したり、目盛り線を変更したり、タイトルを付けたりするなど、体裁を整えたいこともあると思います。いくつかの例を紹介しておきます。まずは sinh(x)を描いてみます。ウィンドウを作成する際に、
plt.figure(figsize=(6, 3))としています。
In [1]: import matplotlib.pyplot as plt
In [2]: fig = plt.figure(figsize=(6, 3))
In [3]: ax = fig.add̲subplot(1, 1, 1)
In [4]: import numpy as np
In [5]: x = np.linspace(-np.pi, np.pi)
In [6]: ax.plot(x, np.sinh(x), color='k')Out[6]: [<matplotlib.lines.Line2D at 0x1116b0908>]
図に plt.title でタイトルを付けてみます（図３­５­１）。fontsize=24 で文字の大きさを 24 ポイントに変えました。
In [7]: plt.title("sinh(x)", fontsize=24)
Out[7]: Text(0.5,1,'sinh(x)')
ちなみに、fontsize は整数の他に文字列で指定することもでき、"xx-small"、"x-small"、"small"、"medium"、"large"、"x-large"、"xx-large"を指定可能です。
fontweight というオプションで文字の太さを変えることもでき、０〜1000 の整数か、"ultralight"、"light"、"normal"、"regular"、"book"、"medium"、"roman"、"semibold"、"demibold"、"demi"、"bold"、"heavy"、"extra bold"、"black"の文字列を指定可能です。例えば太字にするには、fontweight="bold"です。fontsize
オプションは見た目に反映されますが、fontweight オプションは細かく設定しても変わらないようです（表３­５­１）。

図３−５−１sinh(x)をプロットし、タイトルを付けた

表３−５−１

⽂字列の⼤きさと太さを指定するオプション⼀覧

軸の大目盛りの間隔を変更し、ラベルの付いていない小目盛りも追加します。
目盛り線の設定には matplotlib.ticker を使います。ticker.AutoLocator()が大目盛 り 、 ticker.AutoMinorLocator() が 小 目 盛 り の 自 動 設 定 を 返 し 、
xaxis.set̲major̲locator や、xaxis.set̲minor̲locator の値を置き換えます。x
軸 に 小 目 盛 り が 追 加 さ れ た で し ょ う か （ 図 ３ ­ ５ ­ ２ ）。 大 目 盛 り の 方 は
ticker.AutoLocator()の値が 1 毎だったので、変更はありません。
In [8]: import matplotlib.ticker as ticker
In [9]: ax.xaxis.set̲major̲locator(ticker.AutoLocator())
In [10]: ax.xaxis.set̲minor̲locator(ticker.AutoMinorLocator())

図３−５−２x 軸に⼩⽬盛りを追加した

y 軸についても変更します。今度は ticker.MultipleLocator(値)を使い、大目盛りを 10 毎、小目盛りを 2 毎に手動設定してみます（図３­５­３）。
MultipleLocator は指定した値の間隔で目盛りの設定を返すものです。
In [11]: ax.yaxis.set̲major̲locator(ticker.MultipleLocator(10.00))
In [12]: ax.yaxis.set̲minor̲locator(ticker.MultipleLocator(2.00))

図３−５−３y 軸の⼤⽬盛りを 10 毎、⼩⽬盛りを 2 毎にしたx 軸と y 軸にラベルを付けてみます。ax.set̲xlabel、ax.set̲ylabel を使います。文字サイズや色を同時に指定可能です。黒色で x-axis、赤色で y-axis が表示されたでしょうか。サブプロットを複数設定した場合は、ax の番号を変えて、それぞれのサブプロットに別のラベルを設定可能です。
In [13]: ax.set̲xlabel("x-axis", fontsize=20)
Out[13]: Text(0.5,61.3222,'x-axis')
In [14]: ax.set̲ylabel("y-axis", fontsize=20, color='r')Out[14]: Text(30.4722,0.5,'y-axis')
x-axis が図からはみ出しているので、
plt.subplots̲adjust で調整してみます。
hspace=0.8 で水平を８割の大きさに、bottom=0.2 で下に２割の空きを付けます（図３­５­４）。
In [15]: plt.subplots̲adjust(hspace=0.8, bottom=0.2)

図３−５−４

x 軸、y 軸のラベルを追加し、プロット範囲も調整

さらに、plt.grid を使い大目盛りの位置にグリッド線を引きます。折れ線グラ
フ同様、色や線種、線の太さなども指定できます。灰色の点線に設定してみます（図３­５­５）。
In [16]: plt.grid(color='gray', ls=':')

図３−５−５グリッド線を追加した

x=0、y=0 などの線を追加することもできます。plt.axhline で水平方向、
plt.axvline で鉛直方向の線を引きます。色や線種が指定できるので、黒の破線

に設定してみます（図３­５­６）。
In [17]: plt.axhline(y=0, color='k', ls='--')
Out[17]: <matplotlib.lines.Line2D at 0x111707828>
In [18]: plt.axvline(x=0, color='k', ls='--')
Out[18]: <matplotlib.lines.Line2D at 0x111708518>

図３−５−６x=0、y=0 の線を引いた

折れ線グラフと一緒に使える機能をもう１つ紹介しておきます。まずは点線
で cosh(x)を重ねます。sinh(x)より cosh(x)の値が大きいので、plt.fill̲between（ax.fill̲between も同じ）を使い、その間を灰色で塗り潰してみます（図３­５­７）。１番目の引数が x 軸、２番目の引数が y 軸を塗り潰す下限値、３番目の引数が y 軸を塗り潰す上限値を表しています。color='gray', alpha=0.4 で灰色の半透明な色で塗り潰します。plt.title でタイトルも変えておきます。先ほどのplt.title をもう一度呼び出すと、これまでのタイトルが置き換えられます。
In [19]: ax.plot(x, np.cosh(x), color='k', ls='--')
Out[19]: [<matplotlib.lines.Line2D at 0x10c9d6828>]
In [20]: ax.fill̲between(x, np.sinh(x), np.cosh(x), color='gray', alpha=0.4)

Out[20]: <matplotlib.collections.PolyCollection at 0x10c9ec278>
In [21]: plt.title("sinh(x) & cosh(x)", fontsize=24)
Out[21]: Text(0.5,1,'sinh(x) & cosh(x)')

図３−５−７sinh(x)と cosh(x)の間を灰⾊で塗り潰した

最後に、グラフの体裁を整える際に用いることがある主なメソッドを表３­
５­２にまとめておきます。

表３−５−２

図の体裁を整える時に⽤いるメソッド⼀覧

これらのメソッドのうち plt.text では、書式の設定で様々なオプションが出てきたので、ここで表３­５­３にまとめておきます。なお、最初の行の x、yを除けば、plt.text と同じオプションを plt.title、plt.xlabel、plt.ylabel でも使うことができます。
表３­５­３には、これまでに出てこなかったオプションとして、水平方向の位置を指定する horizontalalignment（省略形：ha）、鉛直方向の位置を指定
する verticalalignment（省略形：va）があります。ha には'center'、'right'、'left'を指定可能で、va には'top'、'bottom'、'center'、'baseline'、'center̲baseline'を指定可能です（表３­５­４）。x、y で指定する中央の位置を点線で示しています。
表３−５−３

matplotlib の pyplot.text の主要オプション⼀覧

使⽤⽅法：plt.text(x, y, s)、plt.text(x, y, s, オプション)
表３−５−４

⽂字列の⽔平位置と鉛直位置を指定するオプション、点線は中央の位置

本章では、Numpy を使った関数の作成が度々出てきました。Numpy には便利な機能が多数含まれていますが、ここでは関数の作成や簡単な計算に用いることができる主要な数学関数を紹介しておきます（表３­５­５）。

表３−５−５

Numpy の主要な数学関数⼀覧