Python問題集を解いてみよう!!

【Python】Matplotlibでグラフを描いてみよう(基本編)

URLをコピーする
URLをコピーしました!

Python でデータを可視化する、グラフを描くライブラリと言えば、Matplotlib です。

今回は Matplotlib を使用してグラフの描く時の基本的な部分をまとめました。

本ブログは Colofulbox で運用しています
目次

インストール

Matplotlib は外部ライブラリなので、pip等でインストールが必要です。

pip install matplotlib

適宜、インストールしてください。

Google Colaboratory はデフォルトで Matplotlib がインストールされています。

Google Colaboratory

本記事に掲載しているコードは Google Colaboratory で動作を確認しています。

下記からアクセスして、ご自身のGoogleドライブにコピーしていただければ、すぐに実行できます。

環境構築の不要な Google が提供している Webサービスなので、Python を学習中の方にはオススメです。

基本形

まずは、基本の形を覚えることをおすすめします。

Matplotlib はいろいろな書き方ができるのですが、私はいつも次の形にしています。

STEP
pyplotモジュールをimport

ほとんどの場合、pyplotモジュールのみで事足りるので、pyplotモジュールをimportします。

import matplotlib.pyplot as plt
STEP
データを定義

グラフにしたいデータを定義します。

data_x = [1, 2, 3, 4, 5]
data_y = [1, 2, 3, 4, 5]
STEP
Figureインスタンスを作成

Figureインスタンスはグラフを描くキャンバスのようなイメージです。

fig = plt.figure()
STEP
FigureインスタンスにAxesオブジェクトを追加

Axesオブジェクトは描くグラフのことを指しています。

キャンバスにグラフの枠を描くようなイメージです。

ax = fig.add_subplot()
STEP
Axesオブジェクトにグラフの種類とデータを設定

Axesオブジェクトにグラフの種類とデータを設定します。

plot()は線グラフになります。

ax.plot(data_x, data_y)
STEP
グラフを表示する

最後にグラフを表示します。

fig.show()

以上がグラフを表示するまでの基本の形です。

まとめると次のようになります。

# pyplotモジュールをimport
import matplotlib.pyplot as plt

# データを定義
data_x = [1, 2, 3, 4, 5]
data_y = [1, 2, 3, 4, 5]

# Figureインスタンスを作成
fig = plt.figure()

# FigureインスタンスにAxesオブジェクトを追加
ax = fig.add_subplot()

# Axesオブジェクトにグラフの種類とデータを設定
ax.plot(data_x, data_y)

# グラフを表示する
fig.show()
上記の実行結果

今回はこの基本形をベースに進めていきます。

Figureインスタンスの設定

Figureインスタンスを作成する際に、引数を指定することでキャンバスの大きさ、色などを指定できます。

項目説明デフォルト値
figsizeキャンバスのサイズを指定
(width, height)の形式
単位はインチ
(6.4, 4.8)
dpi解像度を指定
1インチあたりドット数で指定
100.0
facecolor背景色‘white’
edgecolor枠線の色‘white’
linewidth枠線の太さ0
tight_layoutラベルや凡例などの配置を自動調整する機能のオン・オフを指定
Trueでオン
False
figure()の主な引数

tight_layoutの効果は分かりづらいので後に回し、それ以外を設定してみます。

こんな感じ。

import matplotlib.pyplot as plt

data_x1 = [5, 4, 3, 2, 1]
data_y1 = [1, 2, 3, 4, 5]

fig1 = plt.figure(
    figsize=(7.7, 7.7),
    dpi=50,
    facecolor='orange',
    edgecolor='black',
    linewidth=5
)
ax1 = fig1.add_subplot()

ax1.plot(data_x1, data_y1)

fig1.show()
上記の実行結果

facecolorは分かりやすいですね。

figsizeも縦横比を同じにしたので、反映されていることが分かります。

dpiはデフォルト値の半分にしたので、少し画像が荒くなっているのが分かるでしょうか。

より鮮明にしたい場合はこのdpiに大きな値を指定します。

edgecolorlinewidthも反映されていることが分かりやすいですね。

複数のデータをグラフにする

次は、複数のデータをグラフにしてみます。

これは簡単で、ax.plot()を追加するだけです。

こんな感じ。

# pyplotモジュールをimport
import matplotlib.pyplot as plt

# データを定義
data_x2 = [1, 2, 3, 4, 5]
data_y2_1 = [1, 2, 3, 4, 5]
data_y2_2 = [5, 4, 3, 2, 1]

# Figureインスタンスを作成
fig2 = plt.figure(
    dpi=120,
    facecolor='orange',
    edgecolor='black',
    linewidth=5
)

# FigureインスタンスにAxesオブジェクトを追加
ax2 = fig2.add_subplot()

# Axesオブジェクトにグラフの種類とデータを設定
ax2.plot(data_x2, data_y2_1)
ax2.plot(data_x2, data_y2_2)

# グラフを表示
fig2.show()
上記の実行結果

線の色は指定しなくても、自動で別の色にしてくれます。

凡例を表示する

複数の(系統の)データを表示させることができました。

ただ、このままだと、どの線がどのデータなのかが分かりません。

そこで、次は、凡例を表示させます。

凡例はFigureインスタンスとAxesオブジェクトに設定できますが、今回はAxesオブジェクトのほうに設定します。

凡例はlegend()メソッドを使用します。

legend()メソッドの主な引数は次の5つです。

項目説明デフォルト値
bbox_to_anchor凡例を表示する位置をタプル形式で指定します。
(0, 0)がグラフの左下、(1, 1)がグラフの右上になります。
(0, 1)
※左上
locbbox_to_anchorで指定した位置に凡例の枠のどこを合わせるか を指定します。‘upper left’
borderaxespadbbox_to_anchorで指定した位置と、locで指定した場所との距離を指定します。0.5
facecolor凡例の背景色‘white’
fontsize凡例のフォントサイズ10
legend()メソッドの引数

locに設定できる値は次のものがあります。

Location StringLocation Code
‘best’0
‘upper right’1
‘upper left’2
‘lower left’3
‘lower right’4
‘right’5
‘center left’6
‘center right’7
‘lower center’8
‘upper center’9
‘center’10
legend()の引数locに設定できる値

0〜10でも設定できますが、キーワードで指定したほうが後から見て分かりやすいのでオススメです。

実際に設定してみると、こんな感じ。

# pyplotモジュールをimport
import matplotlib.pyplot as plt

# データを定義
data_x3 = [1, 2, 3, 4, 5]
data_y3_1 = [1, 2, 3, 4, 5]
data_y3_2 = [5, 4, 3, 2, 1]

# Figureインスタンスを作成
fig3 = plt.figure(
    dpi=120,
    facecolor='orange',
    edgecolor='black',
    linewidth=5
)

# FigureインスタンスにAxesオブジェクトを追加
ax3 = fig3.add_subplot()

# Axesオブジェクトにグラフの種類とデータを設定
ax3.plot(data_x3, data_y3_1, label='graph1')
ax3.plot(data_x3, data_y3_2, label='graph2')

# Axesオブジェクトに凡例を追加
ax3.legend(
    bbox_to_anchor=(1, 1), 
    loc='upper left', 
    borderaxespad=0.5,
    facecolor='lime',
    fontsize=10
)

# グラフを表示
fig3.show()
上記の実行結果

表示位置の設定は分かりづらいかもしれませんが、値を変えていろいろ試すと理解しやすいです。

複数のグラフを描く

次は複数のグラフを描いてみます。

複数のグラフを描く方法は簡単で、Axesオブジェクトを追加するだけです。

Axesオブジェクトはadd_subplot()メソッドで追加しましたが、今までは引数を指定していませんでした。

add_subplot()の引数には、グラフを表示する位置を、3桁の整数で指定します。

この3桁の整数は各桁ごとに意味があり、例えば 221 を指定した場合は2行2列に分割した1番目の位置 にグラフが表示されます。

add_subplot(221)
add_subplot(221)の位置

335 を指定した場合は3行3列に分割した5番目の位置 にグラフが表示されます。

add_subplot(335)の位置

2つのグラフを縦に並べる

では、実際に2つのグラフを縦に並べて表示してみます。

こんな感じ。

# pyplotモジュールをimport
import matplotlib.pyplot as plt

# データを定義
data_x4 = [1, 2, 3, 4, 5]
data_y4_1 = [1, 2, 3, 4, 5]
data_y4_2 = [5, 4, 3, 2, 1]

# Figureインスタンスを作成
fig4 = plt.figure(
    dpi=120,
    facecolor='orange',
    edgecolor='black',
    linewidth=5
)

# FigureインスタンスにAxesオブジェクトを追加
ax4_1 = fig4.add_subplot(211)
ax4_2 = fig4.add_subplot(212)

# Axesオブジェクトにグラフの種類とデータを設定
ax4_1.plot(data_x4, data_y4_1, label='graph1')
ax4_2.plot(data_x4, data_y4_2, label='graph2')

# Axesオブジェクトに凡例を追加
ax4_1.legend(
    bbox_to_anchor=(1, 1), 
    loc='upper left', 
    borderaxespad=0.5,
    facecolor='lime',
    fontsize=10
)

ax4_2.legend(
    bbox_to_anchor=(1, 1), 
    loc='upper left', 
    borderaxespad=0.5,
    facecolor='yellow',
    fontsize=10
    
)

# グラフを表示
fig4.show()
上記の実行結果

2つのグラフを縦に並べる → 2行1列 なので、add_subplot(211)add_subplot(212)になっています。

2つのグラフを横に並べる

次は、2つのグラフを横に並べます。

こんな感じ。

# pyplotモジュールをimport
import matplotlib.pyplot as plt

# データを定義
data_x5 = [1, 2, 3, 4, 5]
data_y5_1 = [1, 2, 3, 4, 5]
data_y5_2 = [5, 4, 3, 2, 1]

# Figureインスタンスを作成
fig5 = plt.figure(
    dpi=120,
    facecolor='orange',
    edgecolor='black',
    linewidth=5
)

# FigureインスタンスにAxesオブジェクトを追加
ax5_1 = fig5.add_subplot(121)
ax5_2 = fig5.add_subplot(122)

# Axesオブジェクトにグラフの種類とデータを設定
ax5_1.plot(data_x5, data_y5_1, label='graph1')
ax5_2.plot(data_x5, data_y5_2, label='graph2')

# Axesオブジェクトに凡例を追加
ax5_1.legend(
    bbox_to_anchor=(1, 1), 
    loc='upper left', 
    borderaxespad=0.5,
    facecolor='lime',
    fontsize=10
)

ax5_2.legend(
    bbox_to_anchor=(1, 1), 
    loc='upper left', 
    borderaxespad=0.5,
    facecolor='yellow',
    fontsize=10
)

# グラフを表示
fig5.show()
上記の実行結果

ん???

凡例とグラフが重なってますね。。。

こんな時に役に立つのが、Figure インスタンスを作成する時に指定できるtight_layoutです。

tight_layoutをTrue に設定してみます。

こんな感じ。

# pyplotモジュールをimport
import matplotlib.pyplot as plt

# データを定義
data_x6 = [1, 2, 3, 4, 5]
data_y6_1 = [1, 2, 3, 4, 5]
data_y6_2 = [5, 4, 3, 2, 1]

# Figureインスタンスを作成
fig6 = plt.figure(
    dpi=120,
    facecolor='orange',
    edgecolor='black',
    linewidth=5,
    tight_layout=True
)

# FigureインスタンスにAxesオブジェクトを追加
ax6_1 = fig6.add_subplot(121)
ax6_2 = fig6.add_subplot(122)

# Axesオブジェクトにグラフの種類とデータを設定
ax6_1.plot(data_x6, data_y6_1, label='graph1')
ax6_2.plot(data_x6, data_y6_2, label='graph2')

# Axesオブジェクトに凡例を追加
ax6_1.legend(
    bbox_to_anchor=(1, 1), 
    loc='upper left', 
    borderaxespad=0.5,
    facecolor='lime',
    fontsize=10
)

ax6_2.legend(
    bbox_to_anchor=(1, 1), 
    loc='upper left', 
    borderaxespad=0.5,
    facecolor='yellow',
    fontsize=10
)

fig6.show()
上記の実行結果

キレイに表示されましたね。

グラフの表示が崩れてしまった時はtight_layoutを True にしてみましょう。

冒頭でリンクを共有したGoogle Colaboratory では、3行3列でグラフを9個並べたコードも掲載しているので、そちらも参考にしてみてください。

おわりに

今回は、

Python でデータを可視化する、グラフを描くためのライブラリである Matplotlib の基本的な使い方

をご紹介しました。

基本的な使い方を紹介するために今回は 線グラフ を用いました。

線グラフの細かい設定であったり、棒グラフ、散布図など他のグラフも Matplotlib で描けるので、そちらも近いうちに紹介していきたいと思っています。

以上です。

スポンサーリンク

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
URLをコピーする
URLをコピーしました!

コメント

コメントする

目次
閉じる