Matplotlib

【15分】Pythonでグラフを作成する方法|matplotlibの基本をマスター

【15分】Pythonでグラフを作成する方法|matplotlibの基本をマスター

 

  • Pythonでグラフをどうやって綺麗に書くの?
  • Pythonで綺麗なグラフを書けるようになりたい…

この悩みに答えていきます。

本記事では、初心者でもわかるようにPythonでグラフを書く方法を丁寧に紹介していきます。

本記事を読むメリット

  • 完全初心者でも15分ほどで簡単にグラフが作成できるようになる
  • グラフを綺麗に書くための最低限の知識が得られる

 

 

Pythonでグラフを作成する準備

 

Pythonでグラフを書くためには、ある程度の準備が必要です。

以下の手順で説明していきます

  • matplotlibのインストール
  • グラフを書くためのライブラリをインストール

 

matplotlibのインストール

 

今回は、Pythonでグラフを書くために、matplotlibというライブラリを使います。

Google Colabを使用する場合は、最初からインストールされているため特にインストールする必要はありません。

 

【10分で完了】Google Colabのインストール法・使い方Google Colabは、GPUを使用できるため、低コストかつ高速で機械学習の実装を行う際に必要不可欠なツールです。本記事では、Google Colabのインストール方法と注意事項を10〜15分程度でまとめました。...

 

もし、インストールされていない場合は、パソコンがMacならターミナル、Windowsならコマンドプロンプトから以下のコマンドでインストールすることができます。

pip install matplotlib

 

 

グラフを書くためのライブラリをインポート

 

グラフを作成するための、ライブラリをインポートしていきましょう。

今回インポートするのは、以下のライブラリをインポートすることでグラフを書く準備が整います。

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

 

notebookでグラフを書く場合は、『%matplotlib inline』というおまじないが必要です(この時点で特に理解する必要はないです)

 

 

Pythonグラフの作成方法

 

グラフの作成方法は、簡易的な方法と柔軟性のある方法があります。

  1. 簡易的な方法
  2. 柔軟性のある方法

 

基本的には、Numpyの知識を前提とするので、Numpyの基本を理解していない方は下記の記事を参考にしてください。

 

【入門】numpyの使い方|15分で徹底攻略!機械学習やデータ解析をいち早く行うために、numpyに関する基本事項を体系的にまとめました。15分程度で読めるので、この記事で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座標に自動で設定されます。

 

柔軟性あるグラフの書き方(オブジェクト指向スタイル)

 

柔軟性のあるグラフの書き方は、以下の流れでグラフを作成します。

  1. Figureオブジェクトを作成(ウインドウ)
  2. Axesオブジェクトを作成(グラフ描画する領域)
  3. Axesオブジェクトにプロット

 

Figureオブジェクトは、グラフを配置するためのウインドウの役割をします。

また、Axesオブジェクトは、x-y座標、またはx-y-z座標などで指定できる領域を表します。

基本的には、Figureは1つ以上のAxesオブジェクトを含むことができます!(まさに上図のようなイメージです)

 

少しわかりにくいので下記にイメージを示します。

FigureオブジェクトとAxesオブジェクトFigureオブジェクトと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>

axesオブジェクトの具体例axesオブジェクトの具体例

 

この時点では、プロットされていない空のグラフが作成されます。

引数を以下にまとめておきます。

 

引数 説明
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>

subplotの具体例

 

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 インターフェースよりもオブジェクト指向のインターフェースを使用するようにしてください。

引用 : The Lifecycle of a Plot

 

 

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 = “色”)で色を選ぶだけです!

色の種類は以下のように指定することができます。

matplotlib color listmatplotlibで使用できるcolor list(引用 : List of named colors

 

 

折れ線のスタイルとマーカーの設定

 

次に折れ線のスタイルとマーカーの設定方法の具体例を紹介します。

# 使用するデータ
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)は以下の種類が利用できます。

line styleの種類line styleの種類一覧(引用 : Line-style reference

 

markerの種類

 

markerには以下の種類が利用できます(一部のみ表示します)

markerのリスト【一部のみ表示】使用できるmarker一覧(引用 : matplotlib.markers

 

 

 

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)

 

  1. fig.suptitle : ウインドウにタイトルを追加
  2. set_title : 各グラフにタイトルを追加
  3. set_xlabel : x軸ラベルを追加
  4. 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>

 

凡例の表示方法

  1. plotの引数のlabelを設定する
  2. ax.legendで凡例を表示する

ax.legendの引数を説明します。

legend  
fontsize 文字の大きさ
loc

凡例の場所を指定可能(デフォルトでは自動でベストな位置に設定される)

  • upper left : 左上
  • upper right : 右上
  • lower left : 左下
  • lower right : 右下

 

さらに応用ですが、『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次元グラフを作成することができます。

詳しい内容は、長すぎてしまうので気になる方は下記を参考にしてください(ここまでの内容が理解できれいれば高度なグラフが簡単に作成できます)

 

【matplotlib】Pythonで3次元(3D)グラフを作成|回転させるよ!Pythonのmatplotlibを用いて、3次元グラフを作成する方法を説明しました。さらに、カラーバーの設定・3次元グラフの回転等も詳しく説明しています。可能な限り初心者の方でも理解できるように解説しました。詳しい内容は本記事を参考にしてください。...

 

Pythonでアニメーションを作成する方法

 

Pythonは、ここで勉強したfigオブジェクトとaxオブジェクトを使用することで簡単にアニメーションを作成することができます。

具体的には、Pythonの『matplotlib.animation.ArtistAnimation』と呼ばれるライブラリを使用することで簡単にアニメーションが作成できます。

具体的な方法が気になる方は下記を参考にしてください(これまでの内容が理解できていれば簡単に高度なアニメーションが作成できます)

 

【Python】Matplotlib(ArtistAnimation)によるアニメーション作成法|Google Colab対応本記事では、Pythonのmatplotlibを使用したシミュレーションの作成方法をJupyter notebookとGoogle Colaboratoryの両方のケースで徹底解説しました。また、アニメーションの細かいカスタマイズ方法と保存方法までまとめました。詳しい内容は本記事を参考にしてください。...

 

まとめ

 

Pythonでグラフを作成する方法を紹介しました。

pythonでグラフを書く方法は二通りあります

  • 簡易的な方法
  • 柔軟性のある方法

そのあとに、柔軟性のある方法を使用してグラフを重ねて表示したり、並べて表示する方法を紹介しました。

その後、グラフの保存方法も紹介しました!

Excelにも良さがありますがPythonの方が、1文加えるだけで簡単にカスタマイズできるので便利ですね!

さらにmatplotlibを拡張させた『Seaborn』というライブラリを使用することで、プロレベルのグラフを簡単に作成することができます。

 

【15分で習得】seabornの使い方を徹底解説seabornを使用することで、簡単に高度なグラフを描画することができます。また、使用方法もmatplotlibと変わらず簡単に行うことができます。...

 

ABOUT ME
努力のガリレオ
【運営者】 : 東大で理論物理を研究中(経歴)東京大学, TOEIC950点, NASA留学, カナダ滞在経験有り, 最優秀塾講師賞, オンライン英会話講師試験合格, ブログと独自コンテンツで収益6桁達成 【編集者】: イングリッシュアドバイザーとして勤務中(経歴)中学校教諭一種免許取得[英語],カナダ留学経験あり, TOEIC650点
Python学習を効率化させるサービス

 

Pythonを学習するのに効率的なサービスを紹介していきます。

まず最初におすすめするのは、Udemyです。

Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。

また、セール中は1500円定義で利用することができ、コスパも最強です。

下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。

 

【最新】UdemyでおすすめのPythonコース|東大生が厳選!10万を超える講座があるUdemyの中で、Pythonに関係する講座を厳選しました。また、本記事では、Udemyを使用しながらPythonをどのような順番で勉強するべきかを紹介しました。ぜひ参考にしてください。...

 

他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。

 

【最新】Pythonに強いプログラミングスクール7選|東大生が厳選Pythonの流行と共に、Pythonに強いプログラミングスクールが増えてきました。本記事では、特にPythonを効率的に学ぶことができるプログラミングスクールを経験をもとに厳選して、内容を詳しく解説しています。...

 

自分の学習スタイルに合わせて最適なものを選びましょう。