Tutorial

Pyplot vs. Object-Oriented API

matplotlib には複数の書き方があり、これが初めて触れる人にとっては高いハードルになっています。

二つの書き方を混同して書いても動くことには動きますが、設定を追加していくにつれて何を書いているかわからなくなるからです。

pyplot を使った書き方は簡単でわかりやすいですが、データが複雑なグラフやスタイルにこだわったグラフを書くためには pyplot を使ってゴリ押しで書くよりもオブジェクト指向な書き方のほうが優れています。

そのため、このサイトではオブジェクト指向でグラフを書く方法を紹介していきます。

はじめての matplotlib

pyplot で逐次的に書くよりもオブジェクト指向のほうが優れているとかよくわからないことを考える前に、簡単なグラフを書いてみましょう。特に、プログラミングに慣れ親しんでいない人にとっては書いて慣れるほうが覚えるのも早いです。

1.グラフを書いてみる

まず、matplotlib を呼び出します。これを書くことによって以後は plt でパッケージに用意されている機能(関数)を使うことができます。

import matplotlib.pyplot as plt

グラフを書くときは、グラフオブジェクト fig を生成し、そこにデータやスタイルを追加していくように書いていきます。

fig = plt.figure()

データを入れるための軸オブジェクト ax は一つ以上必要になるので、add_subplot() 関数を使ってグラフに軸を追加します。関数に与えている数字で出力する軸の個数と位置を決めていますが、ここでは表示する軸は一つなので "111" で進めます。

ax = fig.add_subplot(111)

グラフを表示するためにはもちろんデータも必要です。データは軸にグラフの種類を指定して入れていきます。ここでは、例として好きな果物についてのアンケート結果を棒グラフで表示することにします。

label = ['apple', 'banana', 'grape']
data = [4, 5, 2]

ax.bar(label, data)

これでグラフを書く準備が整ったので、出力してみましょう。

plt.show()

2.スタイルを追加する

うまく出力できたでしょうか?

これでとりあえずグラフは書けるようになりましたが、グラフのタイトルもなければ軸が何を表しているのかもわかりません。とても不親切なグラフになってしまいます。

まずはグラフにタイトルをつけてみましょう。グラフのタイトルは軸オブジェクトに指定するように追加します。表示されているグラフを消して、先ほど書いたコードの続きに追加します。グラフや軸のタイトルが英語になっていますが、日本語を表示したい場合はフォントの設定が必要になるのでここでは割愛します。

ax.set_title('Which fruit do you like?')

# 出力するためのコードを必ず最後にする
plt.show()

軸のタイトルも欲しいので、x軸とy軸にそれぞれ名前を振ります。これも軸オブジェクトに指定するように追加します。

ax.set_xlabel('fruits')
ax.set_ylabel('number')

グラフと軸にタイトルを指定したので、もう一度出力してみます。

ここまで書いた内容をまとめると、以下のようになります。

import matplotlib.pyplot as plt

# グラフオブジェクト作成
fig = plt.figure()

# 軸作成
ax = fig.add_subplot(111)

# データのラベルと値
label = ['apple', 'banana', 'grape']
data = [4, 5, 2]

# 軸にデータを入れる
# グラフの種類は棒グラフ
ax.bar(label, data)

# グラフのタイトルを設定する
ax.set_title('Which fruit do you like?')

# 軸のタイトルを追加する
ax.set_xlabel('fruits')
ax.set_ylabel('number')

# グラフを表示する
plt.show()

3.CSV からグラフを作成する

これで matplotlib を使ってグラフを書く基礎ができました!

しかし、表示したいデータが外部ファイルとしてある場合はどうすればよいのでしょう。毎回実行ファイルに貼り付けるわけにはいきませんね。

ここではよく用いられる CSV 形式のファイルからデータを読み込んで出力する方法を紹介します。

CSV を読み込むときには pandas というパッケージを利用します。インストールされていない場合は、Pandas の利用にしたがってインストールしてください。

今回読み込む CSV の内容は、2019年9月1日から一週間の東京の最高気温・最低気温の推移です。CSV ファイルは実行ファイルと同じディレクトリに data.csv として保存しているものとします。

day,lowest temperature,highest temperature
9/1,25,32.1
9/2,24.1,31.8
9/3,24.7,28.5
9/4,22.5,26.5
9/5,23,29.6
9/6,23.1,32.9
9/7,24.8,33.5

はじめに、パッケージを読み込みます。pandas は慣例に従って pd とします。

import matplotlib.pyplot as plt
import pandas as pd

パッケージを読み込んだので、CSV からデータを読み込めるようになりました。pandas では読み込んだデータをデータフレームと呼び、変数名は慣例として df が使われています。CSV からデータを読み込むときは read_csv() 関数を使います。

df = pd.read_csv('./data.csv')

次に、先ほどと同じようにグラフオブジェクト、軸オブジェクトを作成します。

fig = plt.figure()
ax = fig.add_subplot(111)

軸オブジェクトを作成したので、データを入れていきます。今度は気温の変化を見たいので、折れ線グラフを使ってみましょう。また、同じグラフに最高気温と最低気温を表示して比較したいので、同じ軸オブジェクトに二つのデータを入れます。

bar() 関数や plot() 関数は第一引数にx軸、第二引数にy軸に表示したい値を入れます。CSV から読み込んだデータフレーム df を使い、CSV に含まれている列のタイトルを指定してデータを抽出します。

ax.plot(df['day'], df['lowest temperature'])
ax.plot(df['day'], df['highest temperature'])

今回は二種類のデータがグラフに表示されるので、見分けられるように凡例も付けます。

ax.legend()

あとは適切にグラフや軸のタイトルを設定し、出力してみましょう。

複数のデータを一つの軸オブジェクトに入れると、上の図のように色を塗り分けてくれます。デフォルトでは10種類の色が順番に割り当てられます。

まとめると、以下のようなソースコードになります。

import matplotlib.pyplot as plt
import pandas as pd

# データフレーム作成
df = pd.read_csv('./data.csv')

fig = plt.figure()
ax = fig.add_subplot(111)

# グラフの種類は折れ線グラフ
ax.plot(df['day'], df['lowest temperature'])
ax.plot(df['day'], df['highest temperature'])

# 凡例
ax.legend()

ax.set_title('Temperature in Tokyo')

ax.set_xlabel('day')
ax.set_ylabel('temperature')

plt.show()