【初心者向け】Python講師がグラフ描画ライブラリMatplotlibの使い方を解説
Matplotlibとは?
Matplotlib(マットプロットリブ)は、Pythonの便利なライブラリの一つです。
Matplotlibを使えば、様々なグラフを作成したりデータを可視化することができます。Matplotlibのpyplotモジュールはグラフ描画のための関数がまとまっていて、これをimportすることで簡単なグラフが描けるようになります。
実はMatplotlibでグラフを描くには2つの手法があります。
①pyplotモジュールの関数を呼び出して描く方法 と
②グラフの土台になるオブジェクトをインスタンス化してその中のメソッドを使う方法 です。
それぞれに長所と短所があり、①の関数を使う方法は、簡単だが詳細なグラフ表現ができない、②のインスタンス化して使う方法は、詳細なグラフ表現ができるが面倒、という特徴があります。
ネットでMatplotlibの情報を調べると、この2つの情報が混在しているように見えます。今、自分がどの手法でグラフを描いているのかを認識して情報を取捨選択するようにしましょう。この記事では①の関数を使う方法を紹介します。
また、簡単なグラフであればPandasのインポートだけで描くこともできます。
Pandasから直接呼び出す方法は比較的分かりやすいので、初心者の方はこのやり方を学ぶのもおすすめです。
いずれにせよ、グラフ描画はデータを扱う業務での必須知識ですので、この機会にしっかりと身に付けましょう!

参考: Matplotlib公式doc
Matplotlibのインストールとインポート
install
pip install matplotlib
※Google Colaboratoryではインストール不要
import
pyplotモジュールは、短縮形「plt」でimportするのが一般的です。
import matplotlib.pyplot as plt
ライブラリとモジュールの準備ができました。
試しにいろいろなグラフを作成してみましょう

簡単な線グラフを描く
plt.plot([1, 2, 3, 4], [2, 4, 6, 8])
plot()の引数でグラフのマーカーを指定できます。引数三番目に ‘o’ と指定するとマーカーが丸、’x’ と指定するとマーカーがバツになります。その他アスタリスク ‘*’ なども使えます。 マイナス「-」や「–」は線となり、デフォルトでは線に指定されています。
また、マーカーは色の名前の頭文字1字を記述することで、色を変えることも可能です。赤丸なら ‘ro’とします。
形状例)
“o” – 点
“^” – 三角の点
“s” – 四角の点
色例)
“red” もしくは “r” – 赤
“green” もしくは “g” – 緑
“blue” もしくは “b” – 青
figure()でfigsizeを指定するとグラフのサイズを指定できます。
plot()の場合、マーカーを ‘o’ にすると散布図で ‘-‘ にすると線グラフになりますが、plot()の代わりに以下の関数を使うことでグラフの種類を変えることもできます。
・scatter() : 散布図
・bar() : 棒グラフ
・hist() : ヒストグラム
より詳細な引数の例は以下のリストを参照してください。
plot関数 引数の例
============= ===============================
character description
============= ===============================
``'.'`` point marker
``','`` pixel marker
``'o'`` circle marker
``'v'`` triangle_down marker
``'^'`` triangle_up marker
``'<'`` triangle_left marker
``'>'`` triangle_right marker
``'1'`` tri_down marker
``'2'`` tri_up marker
``'3'`` tri_left marker
``'4'`` tri_right marker
``'s'`` square marker
``'p'`` pentagon marker
``'*'`` star marker
``'h'`` hexagon1 marker
``'H'`` hexagon2 marker
``'+'`` plus marker
``'x'`` x marker
``'D'`` diamond marker
``'d'`` thin_diamond marker
``'|'`` vline marker
``'_'`` hline marker
============= ===============================
**Line Styles**
============= ===============================
character description
============= ===============================
``'-'`` solid line style
``'--'`` dashed line style
``'-.'`` dash-dot line style
``':'`` dotted line style
============= ===============================
Example format strings::
'b' # blue markers with default shape
'or' # red circles
'-g' # green solid line
'--' # dashed line with default color
'^k:' # black triangle_up markers connected by a dotted line
**Colors**
The supported color abbreviations are the single letter codes
============= ===============================
character color
============= ===============================
``'b'`` blue
``'g'`` green
``'r'`` red
``'c'`` cyan
``'m'`` magenta
``'y'`` yellow
``'k'`` black
``'w'`` white
============= ===============================
線グラフでsinカーブを描く
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.2) # -10から10まで0.2区切りで配列を作る
y = np.sin(x) # 配列xの値に関してそれぞれsin(x)を求めてy軸の配列を生成
plt.plot(x,y) # この場合のplot関数の第一引数xは、x軸に対応し、第二引数のyがy軸にあたります。
plt.show()
np.random.seed(0)
x = np.linspace(-10, 10, 100) # -10から10まで配列の長さ100で作成(点が100個)
y = np.sin(x) # 配列xの値に関してそれぞれsin(x)を求めてy軸の配列を生成
plt.figure(figsize=(10,6)) # グラフのサイズ指定
plt.plot(x, y,'ro') # 赤丸で作成
plt.title('sin curve')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()
plt.xlabel()でx軸のラベルを、plt.ylabel()でy軸のラベルを指定できます。
グラフを保存したい場合は、plt.savefig()で画像として保存できます。
折れ線グラフ
折れ線グラフは、数量の大きさを表す位置を線で結んだものです。
data = [20, 40, 60, 80 ]
y_data = [10, 8, 3, 2]
plt.plot(data, y_data, marker="o")
plt.savefig("sample_graph.png")
plt.show()
折れ線グラフは、時間と共に変化する数量を示す時に使います。

散布図
散布図は、横軸と縦軸にそれぞれ別の量をとり、データをプロットしたグラフ
※日本語は文字化けしてトーフ(白四角の羅列)が表示されます。
np.random.seed(0)
x = np.random.randn(30)
y = np.sin(x) + np.random.randn(30)
plt.figure(figsize=(10,6))
plt.plot(x, y,'go')
plt.title('日本語')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()
散布図は、2つのデータに関係があるかを見る時に使います。
日本語の文字化けについては、後程対処法を紹介します。

棒グラフを描く
x = np.arange(1,10)
y = 2*x
plt.bar(x, y,fc='r')
plt.show()
# 売上推移の棒グラフ
m = ("1", "2", "3", "4", "5", "6", "7","8","9","10","11","12")
y_pos = np.arange(len(m))
sales = [10, 12, 36, 49, 72, 93, 130, 140, 142, 157, 191, 250]
plt.bar(y_pos, sales, alpha=0.5)
plt.ylabel("Sales")
plt.title("Sales Trends") # 売上推移
plt.show()
plt.bar()をplt.barh()にすることで、横向きの棒グラフを作成することもできます。
# 売上推移の棒グラフ
m = ("1", "2", "3", "4", "5", "6", "7","8","9","10","11","12")
y_pos = np.arange(len(m))
sales = [10, 12, 36, 49, 72, 93, 130, 140, 142, 157, 191, 250]
plt.barh(y_pos, sales, alpha=0.5) # 横棒グラフ指定
plt.ylabel("Sales")
plt.title("Sales Trends") # 売上推移
plt.show()
棒グラフは、複数の独立した項目同士のデータを比較する時に使います。

円グラフを描く
x = np.arange(1,10,2)
label = ["Apple", "Banana", "Orange", "Grape", "Strawberry"]
plt.pie(x,labels=label, autopct="%1.1f%%")
plt.show()
autopct=”%1.1f%%”とすることで、小数点1桁までの%表示にしています。
円グラフは、全体の構成比を見る時に使います。

グラフの分割(複数描画)
subplotの指定は(縦方向の数,横方向の数,そのグラフは何番目のものかの数値)
plt.figure(figsize=(20,6))
plt.subplot(2,1,1) #これがサブプロット作成
x = np.linspace(-10, 10, 100)
plt.plot(x, np.sin(x))
plt.subplot(2,1,2)
y = np.linspace(-10, 10, 100)
plt.plot(y,np.sin(2*y))
plt.grid(True)
複数描画することで、異なるデータの関係性や規則性を見付けることができます。

ヒストグラム
# 平均10、標準偏差10 の正規乱数を100件生成
x = np.random.normal(20, 10, 100)
plt.hist(x)
# ヒストグラムを表示
plt.show()
plt.histの引数に「bins=整数」で棒の数を指定できます。(例:plt.hist(x, bins=16))
orientation=”horizontal”をオプション指定すると横棒での描画が出来ます。
ヒストグラムは、ある項目の散らばり具合(度数分布)を表す時に使います。

日本語化処理
グラフ内の日本語が文字化けしてしまったときの対処法を解説します。
install
pip install japanize-matplotlib
import
import matplotlib.pyplot as plt
import japanize_matplotlib
import numpy as np
from numpy import random
日本語が文字化けした散布図を再度描画してみましょう。
random.seed(0)
x = np.random.randn(30)
y = np.sin(x) + np.random.randn(30)
plt.figure(figsize=(10,6))
plt.plot(x, y,'go')
plt.title('日本語')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()
タイトルが日本語になっていますね。
デフォルトで日本語を使用したい場合は、初めの段階でインストールしておきましょう。
以上、Matplotlibの基本的な使い方でした。
ここまで出来た方は、Pandasを使ったグラフ描写にも挑戦してみましょう。


Start Labでは、
未経験でも始められる入門コースから、DXや機械学習に特化したコースまで
スキルや目的に合わせて学習コースをお選びいただけます!
まずはお気軽にお問い合わせください✨