Matplotlibによるグラフ作成のポイントをサンプル付きで紹介

python でグラフを描画する場合によく使われるのが matplitlib です。わずか数行でグラフを描くことができる手軽さと、様々な種類のグラフを組み合わせることができる柔軟性を兼ね備えています。

今回は、データの可視化に欠かせない matplitlib の基本的な使い方について紹介します。

尚、Matplotlibを使って簡単に複合グラフが描画できるクラスを「【コピペOK】Matplotlibで簡単グラフ作成!自作ライブラリ「MultiChart」の使い方を解説」で紹介しています。すぐにグラフを描きたい方は、こちらの記事がお勧めです。

あわせて読みたい
【コピペOK】Matplotlibで簡単グラフ作成!自作ライブラリ「MultiChart」の使い方を解説 Matplotlibは強力なグラフ作成ライブラリですが、複数のグラフを組み合わせる場合、コードが冗長になりがちです。また、簡単なグラフを描く場合でも、グラフごとにメソ...
目次

matplitlibの概要

matplotlib を使うと、グラフ毎に用意された専用メソッドにデータを指定し、show メソッドを呼び出すだけでグラフを表示することが可能です。

例えば、pandas の read_csv を使ってCSVファイルを読み込み、折れ線グラフを表示する場合は次の様になります。

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('d:\data.csv')
plt.plot(df)
plt.show()

表示されるグラフに対してマウス操作をすることで、グラフのスクロールや拡大表示が行えるほか、表示された状態を画像ファイルとして保存することも可能です。

matplotlib の詳しい使い方については「matplotlib公式ページ」に詳細情報が記載されているので併せてご覧ください。とにかく表現力が豊かで、様々なグラフを描くことが出来ます。

下記は公式サイトに掲載されているサンプルの一部です。

matplitlib は pip コマンドでインストールする必要があります。

pip install matplotlib

Pythonで matplitlib を使い際は、下記の通りインポートしておきましょう。

import matplotlib.pyplot as plt

matplitlib の基礎(レイアウト)

matplotlib は 1つの表示エリアを分割し、異なった種類のグラフを複数同時に表示することが可能です。例えるなら、1つのホワイトボードに対して異なるグラフを張り付けるようなイメージです。

以下はグラフ表示の具体例です。本記事を一通り読み終えたら、ソースコードの中身が理解できると思いますので、今はサラっと目を通すだけに留めておいてください。

import matplotlib.pyplot as plt
from matplotlib import rcParams

month=[1,2,3,4,5,6,7,8,9,10,11,12]
price=[10,15,20,25,30,32,33,34,35,35,36,36]
count=[31,27,29,28,34,31,34,29,31,26,28,30]

fig = plt.figure()
fig.subplots_adjust(hspace=0.5)

ax1 = fig.add_subplot(2,1,1)
ax1.plot(month,price)

ax2 = fig.add_subplot(2,1,2)
ax2.bar(month,count)

plt.show()

表示エリアの構成(figure/Axes/Axis)

この ホワイトボードに相当するものを figure と呼んでいます。1つの figure は分割して別々のグラフを表示することが可能で、分割した1つ1つのことを Axes(Axisの複数形の表現) と呼びます。

また、Axesは 複数の軸(X軸、Y軸)で構成されているので、この軸のことをAxisと呼んでいます。

以上のことを図にすると以下のようになります。

表示エリアの分割(add_subplot )

複数のグラフを表示させたい場合は、figure を分割します。具体的には add_subplot の引数に、行数、列数、表示位置を指定します。

分割すると言っても、物理的に分割されるわけではありません。あくまでも、グラフを figure のどの位置に、どれくらいの表示範囲を使って描画するかを指定するのです。

グラフを1つ描画するたびに add_subplot を呼び出し、その際に行、列、位置を指定する必要があります。
1つの figure に異なるサイズのグラフを描画したい場合、グラフごとに行と列の値を変えて、個々のグラフのサイズを調整します。

ax1 = fig.add_subplot(2,1,1)
ax1.plot([1,2,3,4,5,6,7,8,9,10,11,12],[10,15,20,25,30,32,33,34,35,35,36,36])

ax2 = fig.add_subplot(2,1,2)
ax2.bar([1,2,3,4,5,6,7,8,9,10,11,12],[31,27,29,28,34,31,34,29,31,26,28,30])

グラフ内マージン(subplots_adjust、left/right/top/bottom)

グラフによっては、軸のタイトルが外枠にはみ出す場合があります。このような時は、subplots_adjust メソッドの引数(left,right,top,bottom)を使ってグラフ毎に上下左右のマージンを調整することが可能です。

マージンはX軸、Y軸それぞれ最小を0,最大を1とした場合の比率で指定します。初期値は 次のようになっています。

leftrigthtopbottom
0.1250.90.90.1
plt.plot([1,2,3,4,5],[1,2,3,4,5])
plt.subplots_adjust(left=0.3,right=0.82,top=0.82,bottom=0.3)

グラフ間マージン(subplots_adjust、wspace/hspace

複数のグラフを描画する際は、グラフ間のマージンを指定することができます。グラフ間のマージンは縦方向と横方向の指定が可能で、初期値は次のようになっています。

wspacehspace
0.1250.9
plt.subplots_adjust(hspace=0.8,wspace=0.6)

日本語フォントの表示(文字化け対策)

matplotlib でグラフを表示する際、そのままではタイトルや軸タイトルの漢字が文字化けしてしまいます。
対策は、 matplotlib が対応している日本語フォントを指定することです

グラフ毎にフォントファミリーを指定することも可能ですが、面倒なので一括で指定してしまいましょう。具体的には、rcParams をインポートし、rcParams['font.family'] にて日本語フォントを指定します。

import matplotlib.pyplot as plt
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12'          # フォントサイズを指定

#これ以降は漢字が表示できるようになる

matplitlib は全ての日本語フォントに対応している訳ではありませんが、Meiryo、Yu Gothic、MS Gothic、MS Mincho、HGGothicM、HGMinchoB、HGGothicE、HGMinchoE など使えるフォントは結構あります。

matplitlib による単一グラフ描画

単一グラフを表示する

1つのグラフを描くだけなら、非常に簡単です。例えば折れ線グラフを例にすると、figure⇒plot⇒show の順でメソッドを呼ぶことでグラフが描画できます。

import matplotlib.pyplot as plt

#データを準備
x=[1,2,3,4,5]
y=[10,20,30,40,50]

#figureを作成
plt.figure()
#グラフを作成
plt.plot(x,y)
#グラフを描画
plt.show()

グラフの体裁を整える

これだけだと少し寂しいので、背景色やフォント、線種などを指定してみましょう。

見栄えを良くするために、figreやグラフのサイズ(インチ指定)、背景色、折れ線の色や種類、マーカーサイズなどを指定してみました。増えたコードの大半は装飾に関する記述です。

import matplotlib.pyplot as plt
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12           # フォントサイズを指定

#figureを作成(グラフのサイズ、背景色、縁の色、縁のサイズを指定)
plt.figure(figsize=(6,4),facecolor='cyan', linewidth=5, edgecolor='blue')

plt.gca().set_facecolor('lightblue') #グラフの背景色を設定
plt.title('X-Yの推移')               # グラフのタイトル
plt.xlabel('Y軸')                    # x軸のラベル
plt.ylabel('X軸')                    # y軸のラベル
plt.grid(True)                       # グリッドを表示する

#データを準備
x=[1,2,3,4,5]
y=[10,20,30,40,50]

# グラフを作成(線の色、線のスタイル、マーカーの形状を指定)
plt.plot(x,y,color='black',linestyle='dotted', marker='o')

# グラフを描画する
plt.show()

matplitlib による複数グラフ描画

複数のグラフを表示する場合は、add_subplot を使います。add_subplotの引数には、行、列、位置を指定します。
この行と列の指定で出来上がる格子状のエリアに対して、グラフの表示位置を指定することになるため、言い換えると
「〇行□列で分割した場合のn番目」と考えると分かり易いです。

例えば、add_subplot(3,2,4)と指定すると、figureを行3,列2で分割すると6個のエリアを作ることができますが、この中の4番目のエリアにグラフが表示されることになります。

上記の考え方を元に実際に2行1列で分割した例を提示しておきます。

import matplotlib.pyplot as plt
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12           # フォントサイズを指定

month=[1,2,3,4,5,6,7,8,9,10,11,12]
price=[100,150,200,250,300,320,330,340,350,355,360,365]
count=[310,270,290,280,340,310,340,290,310,265,280,300]

rcParams['font.family'] = 'Meiryo'
rcParams['font.size'] = '8'

fig = plt.figure('売上金額・個数',facecolor='seashell', linewidth=5, edgecolor='gray')

#グラフ間の高さにおけるマージンを設定
fig.subplots_adjust(hspace=0.5)

ax1 = fig.add_subplot(2,1,1)
ax1.set_facecolor('beige')
ax1.grid(True)
ax1.plot(month,price,color='black',marker="o")
ax1.set_title('売上金額/月',size=8,color='red')
ax1.set_xlabel('月', size = 8,color='blue')
ax1.set_ylabel('売上金額', size = 8,color='blue')

ax2 = fig.add_subplot(2, 1, 2)
ax2.set_facecolor('darkred')
ax2.grid(True)
ax2.plot(month,count,color='white',linestyle='dotted',marker=“x")
ax2.set_title('販売個数/月',size=8,color='red')
ax2.set_xlabel('月', size = 8,color='blue')
ax2.set_ylabel('販売個数', size = 8,color='blue')

# 表示する
plt.show()

グラフのファイル保存

ファイルを保存する場合は pyplot 又は figureインスタンスの savefig メソッドを使用します。

figure(ファイル名)

ファイル名の拡張子を指定することで、それに応じたフォーマットでグラフ画像を保存してくれます。
使える拡張子は次のものがあります。

 eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff

#pyplot のメソッドを使う場合
plt.plot([1,2,3,4,5],[100,150,200,250,300])
plt.savefig('d:/chart.jpg')


#figureインスタンスのメソッドを使う場合
fig=plt.figure()
plt.plot([1,2,3,4,5],[100,150,200,250,300])
plt.savefig('d:/chart.jpg')

代表的なグラフの表示方法

グラフの種類が多いため、ここでは良く使われるものに限定して紹介します。詳細は「公式サイトのGalleryページ」にサンプルソースが掲載されていますので、ご活用ください。

折れ線グラフ

折れ線グラフを描画する場合は plot メソッドを使います。

  plt.plot(x,y)

第1引数と第2引数はグラフに書かせたいデータで、リスト又はタプルで指定します。第2引数は省略可能で、省略した場合は第1引数の内容だけで折れ線が描画されます。

import matplotlib.pyplot as plt
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12           # フォントサイズを指定

# XとYの値をそれぞれリストで指定
plt.plot([1,2,3,4,5],[10,15,30,20,10])
plt.show()

# Yだけの値をタプルで指定
plt.plot((1,2,3,4,5))
plt.show()

第1引数が pandas のデータフレームやNumPy の ndarray の場合は、各列が1つの折れ線データとして解釈され、列の数だけ折れ線が描画されます。

import matplotlib.pyplot as plt
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12           # フォントサイズを指定

# pandasのDataFrameを使ってグラフ表示
df = pd.read_csv('d:\data.csv')
plt.plot(df)
plt.show()

# NumPyのndarrayを使ってグラフ表示
np.loadtxt('p:\data.csv',skiprows=1,delimiter=',')
plt.plot(df)
plt.show()

引数には線の色、種類、マーカーなど多くの種類があります。

引数名内容
label凡例に表示するラベル。
color 又 は c 線の色('yellow'、'red' など)。
使用可能な色名は、こちらの公式サイトに記載。
但し、次の8色については1文字で指定が可能。
Blue⇒’b’、Green⇒'g'、Red⇒'r'、Cyan⇒'c'、Magenta⇒'m'、Yellow⇒'y' 、Black⇒'k'、White⇒'w'
linestyle 又は ls線の線種(dashesが指定されていると無視される)。
次の文字が指定可能。
'-'、 '--'、'-.'、 ':'、 'None'、' '、 ''、 'solid'、 'dashed'、'dashdot'、'dotted'
linewidth 又は lw線の太さ。
dashes線の実線部分と空白部分の長さをリストで指定。([0.2,0.5,0.2])。
markerマーカーの形状を半角1文字で指定(None を指定するとマーカーは非表示)
‘o’⇒丸、‘v’⇒下三角形、‘^’⇒上三角形、‘<‘⇒左三角形、‘>‘⇒右三角形、‘s’⇒四角形、‘p’⇒五角形、‘h’⇒六角形、‘*’⇒星型、‘+’⇒プラス、‘x’⇒バツ印
markersize 又は msマーカーのサイズ
markerfacecolor 又は mfcマーカーの色。
markeredgewidth 又は mewマーカーの縁の太さ。
markeredgecolor 又は mecマーカーの縁の色。
alpha線の透明度(0~1で指定)。
zorder線が重なる時の前面/背面の順番。値が大きいほど前面に描画される。

色は下記のカラーマップが指定できます。これはすべてのグラフに共通です。

出展元:「公式サイトのカラーサンプル一覧」

棒グラフ

棒グラフには bar メソッドが用意されており、描画したいデータを次のように引数で渡します。

  plt.bar(x,y)

第1引数はX軸の値であり、第2引数は棒グラフの高さの値を指定します。X軸が文字列の場合は tick_label 引数にリスト形式で指定します。

import matplotlib.pyplot as plt
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12          # フォントサイズを指定

x = [1,2,3,4,5]
y = [10,20,30,20,15]
label = ['餃子','焼飯','焼肉','牛丼','寿司'] 

plt.figure()
plt.bar(x,y,tick_label=label)
plt.show()

引数には次のようなものがあります。

引数名内容
width棒の太さ (初期値: 0.8)
bottom各棒の下側の余白。指定した値だけ宙に浮いて描画される。
後述の積み上げグラフで使用。
color 又は c棒の色。
edgecolor棒の枠線の色。
linewidth棒の枠線の太さ。
tick_labelX 軸のラベル
xerrX 軸方向のエラーバー (誤差範囲) の値(数値又はリストで指定)。
yerrY 軸方向のエラーバー (誤差範囲) の値(数値又はリストで指定)。
ecolorエラーバーの色(値または配列で指定)
capsizeエラーバーの傘のサイズ。
align棒の位置。(初期値:'edge')
’edge’⇒垂直方向の場合は左端, 水平方向の場合は下端、‘center’⇒中央が指定可能。
logTrue に設定すると対数目盛で出力。 (初期値: False)

積み上げグラフ

グラフの色と凡例の色の順番を合わせる

グラフの色と凡例の色の順番を合わせない

積み上げグラフは bar メソッドを使います。その際、グラフの色と凡例の順番を合わせるかどうかで、少しコードが変わってきます。

グラフの色と凡例の色の順番を合わせる

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams


#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12           # フォントサイズを指定

x = [1,2,3,4,5]
y1 = np.array([10,20,30,20,15])
y2 = np.array([5,8,7,10,3])
y3 = np.array([10,17,10,15,14])
y4 = np.array([5,10,20,10,13])
label = ['餃子','焼飯','焼肉','牛丼','寿司'] 
 
plt.figure()
 
#積み上げバー
plt.bar(x,y1+y2+y3+y4,tick_label=label,color='lime',label='東京')
plt.bar(x,y1+y2+y3,tick_label=label,color='orange',label='大阪')
plt.bar(x,y1+y2,tick_label=label,color='violet',label='京都')
plt.bar(x,y1,tick_label=label,color='indigo',label='兵庫')
 
#凡例を表示
plt.legend(loc='upper right',shadow=True)
 
#グラフ表示
plt.show()

積み上げグラフの場合、専用のメソッドが存在しないため、bar メソッドを重ね合わせることで実現します。
ただ単純にbar メソッドを実行しても上から上書きされるだけで、直前に書いた棒よりも高い棒を描くと、既に表示されていた棒が消えてしまいます。

つまり、積み上げグラフは値の加算と表示順序を自分で制御する必要があるため、最初に合計の棒グラフを書き、そこから順に値をマイナスしながら 棒グラフを描くという作業となります。

グラフの色と凡例の色の順番を合わせない

bar メソッドのbuttom 引数を使うと、棒の下側に指定した値だけ余白を作ることが出来ます。これを利用して、積み上げる量をbuttomに指定してあげることでも積み上げグラフが描画できます。
但し、この方法だとグラフの色と凡例の色の順番が逆になります。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12           # フォントサイズを指定

plt.figure()
x = [1,2,3,4,5]
y1 = np.array([10,20,30,20,15])
y2 = np.array([5,8,7,10,3])
y3 = np.array([10,17,10,15,14])
y4 = np.array([5,10,20,10,13])
label = ['餃子','焼飯','焼肉','牛丼','寿司'] 

plt.bar(x,y1,tick_label=label,color='indigo',label='兵庫')
plt.bar(x,y2,bottom=y1,tick_label=label,color='violet',label='京都')
plt.bar(x,y3,bottom=y1+y2,tick_label=label,color='orange',label='大阪')
plt.bar(x,y4,bottom=y1+y2+y3,tick_label=label,color='lime',label='東京')

plt.legend(loc='upper right',shadow=True)

plt.show()

これを利用ことで、次のように書くことが出来ます。

散布図

散布図は scatter メソッドを使います。

plt.scatter(x,y)

第一引数、第2引数にx、y座標をそれぞれ指定します。

import matplotlib.pyplot as plt

x=[1,4,5,6,5,8,12,14,11,9,9,7,6,13,10,11,7,12,4,10,13]
y=[5,8,9,4,5,6,10,10,10,8,7,6,7,15,12,19,8,10,6,12,11]

plt.figure()
plt.scatter(x,y)
plt.show()

個々のマーカーは、カラーマップを使って色分けが可能です。カラーマップを使う場合は、X、Yの各データに対応した色付け用の値を用意する必要があります。

例えば、「速度」「重さ」「温度」という3つの対応するデータがあり、Xを「速度」、Yを「重さ」で散布図を作成し、各マーカーの「温度」を色分けで表現したい場合などに使います。

import matplotlib.pyplot as plt

x=[1,4,5,6,5,8,12,14,11,9,9,7,6,13,10,11,7,12,4,10,13]             #速度データ
y=[5,8,9,4,5,6,10,10,10,8,7,6,7,15,12,19,8,10,6,12,11]             #重さデータ
z=[11,14,15,16,15,18,12,14,11,19,19,17,16,13,10,11,17,12,14,11,15] #温度データ

plt.figure()
cm = plt.cm.get_cmap('RdYlBu')      #カラーマップの取得
sc = plt.scatter(x,y,c=z,cmap=cm)   #散布図の作成
plt.colorbar(sc)                    #カラーバーを表示

plt.show()

scatter メソッドで使える主な引数は次の通りです。

引数名内容
color 又は cマーカーの色。
カラーマップによりマーカーの色を変えたい場合は、データの個数だけ値を用意し、セットする。
markerマーカーの形 (初期値: ‘o’)
cmapカラーマップ。使えるカラーマップは「公式サイトのカラーマップ一覧」を参照。
cmap = plt.cm.get_cmap('RdYlBu')
vmin, vmaxscatterの機能で正規化を行う場合の最大、最小値。
指定しない場合、データの最大・最小値となる。
alphaマーカーの透明度。(0:透明~1:不透明の数値)
linewidthsマーカーの枠線の太さ。
edgecolorsマーカーの枠線の色。

公式サイトに掲載されているカラーマップは次の通りです。

出展元:「公式サイトのカラーマップ」

円グラフ

円グラフを描くには pie メソッドを使います。

  plt.pie(pi, labels=ラベル)

第1引数に円グラフにしたい値、labels 引数にラベルをリストで指定します。

import matplotlib.pyplot as plt
from matplotlib import rcParams

#漢字が使えるフォントを指定する。
rcParams['font.family'] = 'Meiryo'   # フォントを指定
rcParams['font.size'] = 12           # フォントサイズを指定

label = ['餃子','焼飯','焼肉','牛丼','寿司'] 
pi =[500,200,350,220,110]

plt.figure()
plt.pie(pi, labels=label)
plt.show()

pie メソッドの主な引数は次の通りです。

引数名内容
explode指定した要素を中心から離す。
要素の個数だけ値を用意し、話したい要素のみ0以外を指定。
例:[0.1, 0, 0, 0, 0]
labels各要素のラベル。
colors各要素の色。要素の個数だけリストで指定。
autopct構成割合のパーセンテージ表示。 (初期値: None)
pctdistanceautopctを指定した際のパーセンテージの表示位置。
中心: (0.0) ~円周:(1.0) から指定。 (初期値: 0.6)
shadow影の表示指定。(初期値: False)
labeldistanceラベルの表示位置
中心: (0.0) ~円周:(1.0) から指定。 (初期値: 1.1)
startangle各要素の開始角度。 (初期値: None)
radius円の半径。 (初期値: 1)
counterclock各要素の並べ方の指定。
True⇒時計回り False⇒反時計回り。 (初期値: True)
wedgeprops各要素の枠線、色等の属性を指定。 (初期値: None)
辞書形式{'linewidth': 3, 'edgecolor':'white'}
textpropsテキストの色、太字等の属性を指定。 (初期値: None)
辞書形式{'color': 'red', 'weight': 'bold'})

まとめ

matplotlib は機能が豊富で、デザインも細部に渡って指定が可能です。

また、pandas の DataFrame や NumPy の ndarray に対応していて、引数に渡すだけで簡単に表示してくれるので、気軽に可視化するには非常に便利です。

本記事では一部のグラフしか紹介していませんが、基本的な考え方については分かっていただけたかと思います。

あとは、公式サイトのサンプルコードを参考に、必要なグラフを描画してください。

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

この記事を書いた人

コメント

コメントする

目次