【15分】Pythonでグラフを作成する方法|matplotlibの基本をマスター
- Pythonでグラフをどうやって綺麗に書くの?
- Pythonで綺麗なグラフを書けるようになりたい…
この悩みに答えていきます。
本記事では、初心者でもわかるようにPythonでグラフを書く方法を丁寧に紹介していきます。
本記事を読むメリット
- 完全初心者でも15分ほどで簡単にグラフが作成できるようになる
- グラフを綺麗に書くための最低限の知識が得られる
Pythonでグラフを作成する準備
Pythonでグラフを書くためには、ある程度の準備が必要です。
以下の手順で説明していきます
- matplotlibのインストール
- グラフを書くためのライブラリをインストール
matplotlibのインストール
今回は、Pythonでグラフを書くために、matplotlibというライブラリを使います。
Google Colabを使用する場合は、最初からインストールされているため特にインストールする必要はありません。
もし、インストールされていない場合は、パソコンがMacならターミナル、Windowsならコマンドプロンプトから以下のコマンドでインストールすることができます。
pip install matplotlib
グラフを書くためのライブラリをインポート
グラフを作成するための、ライブラリをインポートしていきましょう。
今回インポートするのは、以下のライブラリをインポートすることでグラフを書く準備が整います。
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
notebookでグラフを書く場合は、『%matplotlib inline』というおまじないが必要です(この時点で特に理解する必要はないです)
Pythonグラフの作成方法
グラフの作成方法は、簡易的な方法と柔軟性のある方法があります。
- 簡易的な方法
- 柔軟性のある方法
基本的には、Numpyの知識を前提とするので、Numpyの基本を理解していない方は下記の記事を参考にしてください。
具体的に説明していきます。
グラフを簡易的に書く方法
まずは、簡易的にグラフを作成する方法を説明します。
# x座標の値
x = [1, 2, 3]
# y座標の値
y = [1, 5, 3]
# 簡易的なプロット法
plt.plot(x, y)
# グラフを表示
plt.show()
<Output>
このように『plt.plot』を使用することで簡単にグラフを作成することができます。
しかし、この書き方はカスタマイズ性が低いです…
次章ではより柔軟的にグラフを作成する方法を説明していきます。
『plt.plot』にy座標のみを入力『plt.plot(y)』を設定することで、インデックスがx座標に自動で設定されます。
柔軟性あるグラフの書き方(オブジェクト指向スタイル)
柔軟性のあるグラフの書き方は、以下の流れでグラフを作成します。
- Figureオブジェクトを作成(ウインドウ)
- Axesオブジェクトを作成(グラフ描画する領域)
- Axesオブジェクトにプロット
Figureオブジェクトは、グラフを配置するためのウインドウの役割をします。
また、Axesオブジェクトは、x-y座標、またはx-y-z座標などで指定できる領域を表します。
基本的には、Figureは1つ以上のAxesオブジェクトを含むことができます!(まさに上図のようなイメージです)
少しわかりにくいので下記にイメージを示します。
具体的なコード見てみましょう。
# x座標の設定
x = np.linspace(0, 10, 100)
# プロットする関数
y = x
# Figureオブジェクトを作成
fig = plt.figure()
# axオブジェクトをFigureの上に作成
ax = fig.add_subplot(111)
#axオブジェクトにプロット
ax.plot(x, y)
#プロットの表示
plt.show()
<Output>
先ほどと同じグラフが表示されました。
後半で説明しますが、グラフをカスタマイズする際は、figureオブジェクトやaxesオブジェクトに関するメソッドを使用します。
このようなグラフ作成方法を『オブジェクト指向スタイル』といいます。
少し難しいかもしれないので、もう少し詳しく説明していきます。
Figureオブジェクトの作成方法
下記のコードでFigureオブジェクトを作成することができます。
plt.figure()
この1行でFigureオブジェクトによるウインドウが作成されます。
よく使用する引数を以下にまとめておきます。
引数 | 説明 |
---|---|
figsize | Figureオブジェクト(ウインドウ)の横縦サイズを(float, float) で指定 |
dpi | 解像度を指定 |
facecolor | Figureオブジェクトの背景色の設定 |
linewidth | Figureオブジェクトの外枠の太さ |
edgecolor | Figureオブジェクトの外枠の色 |
Axesオブジェクトの作成方法
Axesオブジェクトを作成するには、『add_subplot』メソッドを使用します。
具体的なコードを下記に示します。
ax = fig.add_subplot(111)
このコードは、ウインドウの『1行1列の1番目の位置』にグラフを表示することを意味します。
より一般的な例を示すために、2行2列のケースを使って説明します。
# Figureオブジェクトを作る
fig = plt.figure(figsize=(8,8))
# Axオブジェクトを作る
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
<output>
この時点では、プロットされていない空のグラフが作成されます。
引数を以下にまとめておきます。
引数 | 説明 |
---|---|
title | グラフのタイトルを設定 |
facecolor(fc) | グラフの背景色 |
alpha | グラフの透明度(0〜1で指定) |
xlabel, ylabel | x, y軸の名前 |
xlim, ylim | x, y軸の最小値, 最大値を(float, float) で指定 |
xticks, yticks | x, y軸の目盛を表示する値をリスト形式で指定 |
xticklabels, yticklablels | x, y軸の目盛に表示するラベルをリスト形式で指定 |
グラフを作成する際は、とりあえず簡単なグラフを表示してから、軸や目盛をカスタマイズすると思います。
実は、matplotlibは、Axes
オブジェクトを作成する際に上記の引数を設定しなくても後からメソッドを使ってカスタマイズできます。
本記事では、後半部分でメソッドを使ってカスタマイズする方法を後半で解説します!
Axesオブジェクトにプロットする
実際に、Axesオブジェクトにプロットを行ってみましょう。
Axesオブジェクトに対して、plot
メソッドを呼ぶだけで、Axesオブジェクトにプロットすることができます。
具体例を以下に示します。
# x座標の設定
x = np.linspace(0, 10, 100)
# プロットする関数
y = x
# Figureオブジェクト
fig = plt.figure(figsize=(8,8))
# Axオブジェクト
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
# グラフにプロットする
ax1.plot(x, y)
# グラフを表示
plt.show()
<Output>
具体例として、『ax1』にプロットしました。
基本的な使い方は以上です。
FigureオブジェクトとAxesオブジェクトを同時作成
下記のコードで、ウインドウとグラフを同時に作成することもできます。
<Input>
#ウインドウとグラフを同時に挿入
fig, axes = plt.subplots(2, 2, figsize=(8, 8))
<Output>
axesオブジェクトは『axes』というリストに格納されています。
<Input>
axes
<Output>
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f71bc8cf9b0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f71bbd15da0>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7f71bbcd4048>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f71bbc82240>]],
dtype=object)
多くの方が、この方法を使用すると思います。
実際に、私が実務で使用する際もFigureオブジェクトとAxesオブジェクトを同時に作成する方法を一番使用します!!
そのため、ここからの具体例では、この方法を利用して色々なグラフを作成していきます。
実際、公式ドキュメントにも以下のように書かれています。
In general, try to use the object-oriented interface over the pyplot interface.
訳) 一般的には、pyplot インターフェースよりもオブジェクト指向のインターフェースを使用するようにしてください。
subplots()の引数について
subplots()
は、先ほど紹介したAxesオブジェクトの引数をsubplot_kw=dic()
内に記入することで使用することができます。
また、figureオブジェクトの引数は、subplots()
にも通常通り使用することができます。
また、subplots()
は以下のような引数を持ちます。
引数 | 説明 |
---|---|
sharex, sharey | True にすると全ての横軸, 縦軸が共有される |
よりAxesオブジェクトを柔軟に配置したい場合は、以下のような機能を利用します。
Figure.add_gridspec()
: さまざまな大きさのAxesオブジェクトを配置できるFigure.add_axes()
: Figureオブジェクトの大きさを1としてAxesオブジェクトの配置位置と大きさを自由にカスタマイズできる
Pythonのグラフを並べて表示する
柔軟性のあるコードの利点の一つとしてグラフを並べて表示するのが簡単になります。
実際のコードを使って説明していきます。
グラフを並べて表示する
グラフを並べて表示するコードは、以下のように書くことができます。
#x座標の設定
x = np.linspace(0, 10, 1000)
#プロットする関数
y1 = x
y2 = x**2
y3 = np.sin(x)
y4 = np.cos(x)
#ウインドウとグラフを同時に挿入
fig, axes = plt.subplots(2, 2, figsize=(8, 8))
#グラフにプロット
axes[0, 0].plot(x, y1)
axes[0, 1].plot(x, y2)
axes[1, 0].plot(x, y3)
axes[1, 1].plot(x, y4)
#グラフを表示
plt.show()
このように、一度にウインドウとグラフを表示でき、たった数行で複数のグラフを書くことができます。
そのため、以下は柔軟性のあるグラフの書き方に焦点を当てて説明していきます。
Pythonグラフを重ねて書く方法
pythonのグラフを重ねて書くためには、『同じグラフにプロットの命令をする』だけで書けます
具体的なコードは、以下のようになります。
# x座標の設定
x = np.linspace(0, 10, 100)
# プロットする関数
y1 = np.sin(x)
y2 = np.cos(x)
# ウインドウとグラフを同時に設定
fig, ax = plt.subplots()
# グラフにプロット
ax.plot(x, y1, color = "b")
ax.plot(x, y2, color = "g")
# プロットの表示
plt.show()
色は、デフォルトでも違う色になるので記入しなくてもOKです!!
Pythonグラフのプロット形式を変える方法
これまでの例で使用してきた折れ線グラフを描画するAxes.plot()
の引数の使い方を詳しく説明します。
折れ線グラフ以外の引数の使い方も類似するところがあるので本記事では特に折れ線グラフを具体例として説明していきます。
まずは、Axes.plot
の引数をまとめます。
引数 | 説明 |
---|---|
color(c) | 折れ線の色を指定(指定方法はこの後詳しく説明) |
linestyle(ls) | 折れ線のスタイルを指定(指定方法はこの後詳しく説明) |
linewidth(lw) | 折れ線の太さを指定(指定方法はこの後詳しく説明) |
alpha | 透明度を0〜1で指定 |
marker | マーカの形状 |
markersize(ms) | マーカのサイズ |
markerfacecolor(mfc) | マーカの色 |
markeredgewidth(mew) | マーカの縁の太さ |
markeredgecolor(mec) | マーカの縁の色 |
具体例を使って使い方を説明していきます。
折れ線の色を変える方法
折れ線の色を変える具体例を紹介します。
# x座標の設定
x = np.linspace(0, 10, 100)
# プロットする関数
y = x
# ウインドウとグラフを同時に
fig, ax = plt.subplots()
# グラフにプロット(color = "指定したい色": これで色指定可能)
ax.plot(x, y, color = "g")
# プロットの表示
plt.show()
<Output>
やり方は、『plot(x, y, color = “色”)』で色を選ぶだけです!
色の種類は以下のように指定することができます。
折れ線のスタイルとマーカーの設定
次に折れ線のスタイルとマーカーの設定方法の具体例を紹介します。
# 使用するデータ
x = np.array([1, 2, 3, 4, 5])
y = np.array([-1, -3, 3, 4, 5])
fig, ax = plt.subplots()
# 折れ線のスタイルとマーカの設定
ax.plot(x, y, ls='--', lw=4, alpha=0.5, marker='o', ms=12, mfc='r', mew=1.5, mec='k')
plt.show()
<output>
linestyle(ls)の種類
linestyle(ls)
は以下の種類が利用できます。
markerの種類
marker
には以下の種類が利用できます(一部のみ表示します)
Pythonグラフの基本的なカスタマイズ
基本的なグラフのカスタマイズ方法を紹介します。
グラフタイトルと軸ラベル
グラフと軸ラベルも簡単につけることができます
具体的なコードは、以下のように書けます
x = np.linspace(1, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, axs = plt.subplots(1, 2, figsize = (8, 4), constrained_layout = True)
axs[0].plot(x, y1)
axs[1].plot(x, y2)
# ウインドウにタイトルを加える
fig.suptitle("Python matplotlib", fontsize = 20)
# グラフにタイトルを加える
axs[0].set_title("sin(x)", fontsize = 15)
axs[1].set_title("cos(x)", fontsize = 15)
# 軸ラベルを加える
axs[0].set_xlabel("time", fontsize = 12)
axs[1].set_xlabel("time", fontsize = 12)
# LaTexも使える
axs[0].set_ylabel(r"$\omega$", fontsize = 12)
- fig.suptitle : ウインドウにタイトルを追加
- set_title : 各グラフにタイトルを追加
- set_xlabel : x軸ラベルを追加
- set_ylabel : y軸ラベルを追加
fontsizeを指定することで、文字の大きさを指定することができます。
また、文字列部分を『r”$ 〜 $”』のように囲むことで、LaTex形式の文字も入力できます。
軸目盛の設定
軸目盛の体裁を整えるためには、『ax.tick_params()
』を使用します。
具体例を早速示します。
x = np.linspace(-5*np.pi, 5* np.pi, 100)
y1 = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y1)
ax.set_title(r"$sin(x)$", fontsize = 15)
ax.set_xlabel("time", fontsize = 12)
ax.set_ylabel(r"$\omega$", fontsize = 12)
# 軸メモリの設定
ax.tick_params(axis='y', width=2, length=8, pad=10, color='r', direction='in', labelsize=15, labelcolor='r')
ax.tick_params(axis='x', width=2, length=8, pad=10, color='r', direction='in', labelsize=15, labelcolor='r')
plt.show()
<output>
具体的に『plt.tick_params()』の引数を説明していきます(詳細な説明は、軸目盛のカスタマイズ(公式)を参考にしてください
引数 | 説明 |
---|---|
axis | 軸目盛をカスタマイズする軸を指定 |
width | 目盛の幅を設定 |
length | 目盛の長さを設定 |
pad | 目盛と目盛ラベルの間の距離を指定 |
direction | 目盛の方向を指定({‘in’, ‘out’, ‘inout’}の中から指定) |
color | 目盛の色を指定 |
labelsize | 目盛ラベルの大きさを指定 |
labelcolor | 目盛ラベルの色を指定 |
colors | 目盛と目盛ラベルの色を同時に指定 |
目盛と目盛ラベルは、相手に情報を伝えるために重要な要素の一つです。
ここで説明した方法を用いて、より伝わりやすい可視化を目指してください。
凡例を表示
凡例を表示する方法を説明します。
具体的なコードは以下のようにかけます。
<Input>
# 使用するデータ
x = np.array([1, 2, 3, 4, 5])
y1 = np.array([-1, -3, 3, 1, 2])
y2 = np.array([5, 4, 2, -3, -1])
y3 = np.array([5, -1, 3, -1, 2])
# ウインドウとグラフを設定
fig, ax = plt.subplots()
# plotlabelを指定する
ax.plot(x, y1, linestyle = '--', color = 'g', label = "No1")
ax.plot(x, y2, linestyle = '-.', color = 'b', label = "No2")
ax.plot(x, y3, linestyle = ':', color = 'r', label = "No3")
# 凡例を表示する
ax.legend(fontsize = 10, loc=0)
plt.show()
<Output>
凡例の表示方法
- plotの引数のlabelを設定する
- ax.legendで凡例を表示する
ax.legendの引数を説明します。
legend | |
---|---|
fontsize | 文字の大きさ |
loc |
凡例の場所を指定可能(デフォルトでは自動でベストな位置に設定される)
|
さらに応用ですが、『bbox_to_anchor』という引数を設定することで、任意の位置に判例を設定することができますが、今回は省略いたします。
対数軸を使用する場合
x軸に対数軸を利用したい場合は、ax.set_xscale('log')
を設定して、y軸の場合は、ax.set_yscale('log')
を使用してください。
fig, ax = plt.subplots()
x = np.linspace(-10, 10, 100)
y = np.exp(x)
ax.plot(x, y)
# 対数軸を利用する場合
ax.set_yscale('log')
plt.show()
<output>
スタイルの変更
matplotlibには、ニーズに合わせて可視化ができるように多くのスタイルが用意されいます。
スタイルを変更することでグラフの雰囲気はガラッと変わります。
使用できるスタイル一覧は以下のように取得できます。
print(plt.style.available)
<output>
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
以下のように選択したスタイルを設定します(今回は具体例として『fivethrtyeight』というスタイルを使用)
plt.style.use('fivethirtyeight')
これで、スタイルの設定は完了です。
グラフを作成すると以下のようにスタイルが変更されます!!
*上記のようにスタイルを変更するとnotebook全てのプロットに選択したスタイルが設定されます。
ブロック単位でスタイルを変更する場合は、plt.style.context()
を使用します。
x = np.array([1, 2, 3, 4, 5])
y = np.array([-1, -3, 3, 1, 2])
with plt.style.context('seaborn'):
fig, ax = plt.subplots()
ax.plot(x, y, linestyle = '--', color = 'g')
plt.show()
<output>
Pythonグラフを保存する方法
グラフを保存する方法も簡単でグラフのコードの最後に下記を入力すること保存が完了します。
#png形式で保存
fig.savefig("test.png")
#pdf形式で保存
fig.savefig("test.pdf")
具体例を下記で紹介します。
#x座標の設定
x = np.linspace(0, 10, 100)
#プロットする関数
y1 = np.sin(x)
y2 = np.cos(x)
#ウインドウを作る
fig = plt.figure()
#ウインドウ上にグラフを挿入
ax = fig.add_subplot(111)
#グラフにプロット
ax.plot(x, y1)
ax.plot(x, y2)
#プロットの表示
plt.show()
#png形式で保存する
fig.savefig("test.png")
そうすることで、このグラフを”test.png”という名前でpng形式でグラフを保存することができます!
Pythonで3次元グラフを作成する方法
Pythonでも、mpl_toolkits.mplot3dからAxes3Dをインポートすることで、驚くほど綺麗な3次元グラフを作成することができます。
詳しい内容は、長すぎてしまうので気になる方は下記を参考にしてください(ここまでの内容が理解できれいれば高度なグラフが簡単に作成できます)
Pythonでアニメーションを作成する方法
Pythonは、ここで勉強したfigオブジェクトとaxオブジェクトを使用することで簡単にアニメーションを作成することができます。
具体的には、Pythonの『matplotlib.animation.ArtistAnimation』と呼ばれるライブラリを使用することで簡単にアニメーションが作成できます。
具体的な方法が気になる方は下記を参考にしてください(これまでの内容が理解できていれば簡単に高度なアニメーションが作成できます)
まとめ
Pythonでグラフを作成する方法を紹介しました。
pythonでグラフを書く方法は二通りあります
- 簡易的な方法
- 柔軟性のある方法
そのあとに、柔軟性のある方法を使用してグラフを重ねて表示したり、並べて表示する方法を紹介しました。
その後、グラフの保存方法も紹介しました!
Excelにも良さがありますがPythonの方が、1文加えるだけで簡単にカスタマイズできるので便利ですね!
さらにmatplotlibを拡張させた『Seaborn』というライブラリを使用することで、プロレベルのグラフを簡単に作成することができます。
Pythonを学習するのに効率的なサービスを紹介していきます。
まず最初におすすめするのは、Udemyです。
Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。
また、セール中は1500円定義で利用することができ、コスパも最強です。
下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。
他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。
自分の学習スタイルに合わせて最適なものを選びましょう。
また、私がPythonを学ぶ際に使用した本を全て暴露しているので参考にしてください。