Pythonのmatplotlib(マットプロットリブと読みます)は「Python用のグラフ描画」ライブラリです。このライブラリを使えば代表的なグラフ(折れ線グラフや棒グラフ、円グラフなど)を簡単に描画することができます。
ここでは
- Pythonのって何?
- Pythonのはどう使うの?
- Pythonの実際にグラフを描画してみたい!
といった方に、matplotlibについて解説します。
matplotlibを使えるようになると、Pythonがより一段と面白くなりますよ!
目次
【Python】matplotlibをインストールする(Macの場合)
matplotlibを使うために、まずはpipでインストールしましょう。
ターミナルで以下のコマンドを実行してください。
$ pip install matplotlib
インストールされるまで少し待ちましょう。インストールが終わったら次のコマンドでインストールされていることを確認できます。
$ pip list installed | grep matplotlib
上のコマンドを実行して、matplotlibが表示されればOKです。
また、途中でnumpyというライブラリも使うので、インストールしていない場合は併せてインストールしておくと捗ります。
$ pip install numpy
【Python】matplotlibの使い方
では実際にmatplotlibを使ってグラフを描画してみましょう。
基本的には各グラフに対応したメソッドにデータのリストを渡し、結果をshow()で表示します。
シンプルな折れ線グラフを描画する
まずは最もシンプルな折れ線グラフを描画してみましょう。
折れ線グラフを描画するにはplot()を使います。
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro']
temperature_avg = [5.6, 7.2, 10.6, 13.6, 20.0, 21.8, 24.1, 28.4, 25.1, 19.4, 13.1, 8.5]
plt.plot(temperature_avg)
plt.show()
先ほどインストールしたmatplotlibのpyplotモジュールをインポートしています。
matplotlibはデータを描画するためのパッケージ群を指すもので、pyplotは実際にグラフを描画するためのモジュールです。matplotlibでグラフ描画する場合の一般的な書き方だと思っておけば問題ありません。
また、matplotlibはそのままでは日本語に対応していません。なのでrcParamsモジュールをインストールし、font.sans-serifに日本語対応したフォントを指定しています。
data変数にはグラフのデータをリストで格納しています。それを折れ線グラフを描画するためのplot()に渡し、show()でグラフを表示します。
上のコードを動かすと、次のようなグラフが表示されます。
タイトルも凡例もないシンプルなグラフですが、ちゃんとdataの内容が折れ線グラフとして表示されました。
でもこれだけではなんのグラフか分からないので、情報を付け足しましょう。
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro']
month = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
temperature_avg = [5.6, 7.2, 10.6, 13.6, 20.0, 21.8, 24.1, 28.4, 25.1, 19.4, 13.1, 8.5]
plt.title("2019年の平均気温の変化(東京)")
plt.xlabel("月")
plt.ylabel("平均気温")
plt.plot(month, temperature_avg)
plt.show()
タイトルに「2019年の平均気温の変化(東京)」、x軸に「月」、y軸に「平均気温」という情報を追加しました。また、plot()引数が2つになっていますが、1つ目の引数に横軸のデータ、2つ目の引数に縦軸のデータを渡しています。
このコードを実行すると下のようなグラフが作成されます。
これでこのグラフが何を指しているのかが分かりました。
複数の折れ線グラフを描画する
今度は北海道と沖縄のデータを追加して、複数のグラフを同時に描画してみましょう。
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro']
month = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
temperature_avg = [5.6, 7.2, 10.6, 13.6, 20.0, 21.8, 24.1, 28.4, 25.1, 19.4, 13.1, 8.5]
temperature_avg_s = [-3.0, -2.6, 2.5, 8.0, 15.7, 17.4, 21.7, 22.5, 19.3, 13.3, 3.9, -0.8]
temperature_avg_n = [18.1, 20.0, 19.9, 22.3, 24.2, 26.5, 28.9, 29.2, 28.0, 26.0, 23.1, 20.0]
plt.title("2019年の平均気温の変化")
plt.xlabel("月")
plt.ylabel("平均気温")
plt.plot(month, temperature_avg, label = "東京")
plt.plot(month, temperature_avg_s, label = "札幌")
plt.plot(month, temperature_avg_n, label = "那覇")
plt.legend(loc = "upper left")
plt.show()
結果は次のようになります。
各都市の平均気温が一目で比較できるようになりました(那覇は冬過ごしやすそうで羨ましい…)。
matplotlibでは複数のグラフを表示すると自動的に色を変えてくれるので、視覚的に分かりやすいですね。
plot()の3つ目の引数に各データの凡例を設定し、legend()で出すロケーションを左上に指定しています。
棒グラフを描画する
棒グラフを描画するにはplot()の代わりにbar()を使います。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro']
x = np.array([0, 1, 2, 3, 4]) #横軸
labels = ['国語', '数学', '理科', '社会', '英語'] #横軸の各項目のラベル
sato = [56, 98, 37, 36, 81] #縦軸
suzuki = [77, 54, 80, 68, 69] #縦軸
tanaka = [89, 71, 87, 95, 27] #縦軸
width = 0.2
plt.bar(x, sato, width=width, label='佐藤')
plt.bar(x + width, suzuki, width=width, label='鈴木', tick_label = labels)
plt.bar(x + width * 2, tanaka, width=width, label='田中')
plt.legend(loc = 'upper left')
plt.title('各教科の得点')
plt.xlabel('得点') #横軸のラベル
plt.show()
bar()は1つ目の引数に横軸、2つ目の引数に縦軸を指定します。また、widthにはバーの幅、labelには各バーの凡例を設定しています。横軸の数値はその棒グラフを描画する位置を指定しています。
横軸のxはnumpyのndarrayで作成しています。こうすることで、全ての数値に対して計算するのが容易になります。
また、bar()の2つ目のtick_labelには横軸のラベルを指定しています。これでどのバーが何の教科の点数なのかが分かるようになりました。
散布図を描画する
次に散布図を描画してみましょう。散布図はscatter()を使います。
import matplotlib.pyplot as plt
import random
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro']
x = []
y = []
for i in range(20, 80):
x.append(i + random.randint(0, 20))
y.append(i + random.randint(0, 20))
plt.scatter(x, y)
plt.title('点数の相関性(数学・物理)')
plt.xlabel('数学の点数')
plt.ylabel('物理の点数')
plt.show()
scatter()を使って数学と物理の点数の相関性を表す散布図を描画しました(それっぽくなるようにrandomで作ったサンプルです)。
円グラフを描画する
円グラフを描画したい場合はpie()を使います。
import matplotlib.pyplot as plt
import random
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro']
population = [3748, 2740, 2327, 1970, 1592, 1530, 1522, 1466, 1307, 1199]
city = ['横浜市', '大阪市', '名古屋市', '札幌市', '福岡市', '川崎市', '神戸市', '京都市', 'さいたま市', '広島市']
plt.pie(
population
, labels = city
, counterclock = False
, startangle = 90
, autopct="%1.1f%%"
, pctdistance=0.7
)
plt.title('人口数TOP10の政令指定都市')
plt.show()
1つ目の引数にはデータを指定しています。
その他に指定した設定は次の通りです。
- labels : 各項目のラベル
- counterclock : 円グラフを時計回りに表示するか、反時計回りに表示するか(Falseは反時計回り)
- startangle : 各項目を表示する角度(ここでは90度を指定)
- autopct : 各項目の割合を表示する
- pctdistance : 項目割合の表示位置を調整する