Matplotlibの棒グラフの書き方

Matpotlibの棒グラフ


Matplotlibで棒グラフを書く方法について。

今回は、iosでPythonが使えるPythonista3を使って、iPhoneだけで棒グラフを作成してみることにする。



バージョンについて

いちおう使用する環境について書いておく
  • iPhone7plusでiosのバージョンは10.30.2
  • Pythonista3のバージョンはv3.1
  • Matplotlibのバージョンは1.4.0
    Matplotlibの最新版は2.0.2(2017/8/3現在)なので、ちょっと古いバージョンを使うことになる。

古いバージョンを使う理由は、Pythonista3にデフォルトで入ってるMatplotlibのバージョンが1.4.0だから。

そして、新しいバージョンを入れて使うことができない(分からない)から。

PythonistaはStaShというシェルでpipを使って外部ライブラリをインストールすることができるが、cとかFortranが使われているライブラリはAppleの方針で使えないもよう...

まあ、基本的な部分は古いバージョンでも同じなので、自分のようなど素人が勉強するぶんには問題ない。

ちなみに、Matplotlibのバージョンは以下のように確認した。

>>> import matplotlib as mpl
>>> mpl.__version__
'1.4.0'

Matplotlibの最新版が使えないのと同じ理由でPandasやSciPyと人気のライブラリも使えないみたい。残念。



棒グラフの作成

それでは本題に入って、Natplolibで棒グラフを作成することにする。

棒グラフ作成の流れ

  1. Matplotlibのpyplotをインポートする
    →pltという名前でインポートするのが一般的
  2. 棒グラフにしたいデータを用意
    →今回ははdatasというリストを用意する
  3. グラフを表示するx軸の位置を用意
    →今回はpositionsというリストを用意する
  4. グラフを作成する
    plt.bar(x軸の位置, グラフにしたいデータ)
  5. グラフを表示する
    plt.show()
import matplotlib.pyplot as plt

datas = [10, 30, 20, 50, 40] #グラフにするデータ
positions = range(1, 6) #x軸の位置

plt.bar(positions, datas) #棒グラフの作成
plt.show() #グラフの表示

グラフ1

これでいちおう棒グラフを作成することができた。が、あまり格好良いグラフではないので、これからこのグラフをカスタマイズしていく。

軸の真ん中に表示する

上のグラフは、x軸上のそれぞれのポイント上にグラフが表示されていない。
軸の真上にグラフを表示するには、barの引数にalign = 'center'を指定する。

import matplotlib.pyplot as plt

datas = [10, 30, 20, 50, 40] #グラフにするデータ
positions = range(1, 6) #x軸の位置

plt.bar(positions, datas, align = 'center') #棒グラフの作成
plt.show() #グラフの表示

グラフ2

x軸の表示を変更する

x軸の表示を変更するには、表示するラベルを用意し、xticks(元の値, 表示する)を記述する。

※Matplotlibのバージョン1.5.0以降は、barの引数tick_labelで表示する値を指定することができる

import matplotlib.pyplot as plt

datas = [10, 30, 20, 50, 40] #グラフにするデータ
positions = range(1, 6) #x軸の位置
x_labels = ['A', 'B', 'C', 'D', 'E'] #x軸に表示するラベル

plt.bar(positions, datas, align = 'center') #棒グラフの作成
plt.xticks(positions, x_labels) #x軸の値の変更
plt.show() #グラフの表示

グラフ3

y軸の範囲を変更する

y軸の範囲を指定するのには、ylim(最小値, 最大値)を使う。

import matplotlib.pyplot as plt

datas = [10, 30, 20, 50, 40] #グラフにするデータ
positions = range(1, 6) #x軸の位置
x_labels = ['A', 'B', 'C', 'D', 'E'] #x軸に表示するラベル

plt.bar(positions, datas, align = 'center') #棒グラフの作成
plt.xticks(positions, x_labels) #x軸の値の変更
plt.ylim(0, 60)
plt.show() #グラフの表示

グラフ5

積み上げグラフ

ここからは棒グラフの上に別の棒グラフを重ねる、積み上げグラフの作り方について
今回は2段の積み上げグラフを作る

複数のデータ用意

グラフにするデータを複数用意する。

ここではdatas1とdatas2というリストを用意した。この2つのデータを使い、datas1にdatas2を積み重ねるグラフを作る。

グラフを重ねる方法

グラフを重ねるために、上の段のグラフの底に下の段の値を指定する。そのために、上の段のグラフのbar()の引数にbottom = 下の段のデータを指定する。

また、2つのグラフの色が同じだと見にくいので、上の段のグラフのbar()の引数colorで色を変える。

import matplotlib.pyplot as plt

datas1 = [10, 30, 20, 50, 40] #グラフにするデータ
datas2 = [40, 10, 50, 30, 20] #グラふに表示するデータその2
positions = range(1, 6) #x軸の位置
x_labels = ['A', 'B', 'C', 'D', 'E'] #x軸に表示するラベル

plt.bar(positions, datas1, align = 'center') #datas1のグラフ
plt.bar(positions, datas2, align = 'center', bottom = datas1, color = 'teal) #datas2のグラフ

plt.xticks(positions, x_labels) #x軸の値の変更
plt.ylim(0, 90) #y軸の表示範囲
plt.show() #グラフの表示

グラフ5

凡例の表示

凡例を表示するには、plt.legend()を使う。

それぞれのバーに対応する凡例を表示するために、bar()でグラフを作成する際に、作成したインスタンスを変数bar1、bar2で受け取っておく。

import matplotlib.pyplot as plt

datas1 = [10, 30, 20, 50, 40] #グラフにするデータ
datas2 = [40, 10, 50, 30, 20] #グラふに表示するデータその2
positions = range(1, 6) #x軸の位置
x_labels = ['A', 'B', 'C', 'D', 'E'] #x軸に表示するラベル

bar1 = plt.bar(positions, datas1, align = 'center') #datas1のグラフ
bar2 = plt.bar(positions, datas2, align = 'center', bottom = datas1, color = 'teal') #datas2のグラフ

plt.xticks(positions, x_labels) #x軸の値の変更
plt.ylim(0, 90) #y軸の表示範囲
plt.legend((bar1, bar2),('group1', 'group2')) #凡例の表示
plt.show() #グラフの表示

グラフ6

スタイルの適用

グラフの見栄えを良くするためにスタイルを適用することにする。
使えるスタイルは以下の方法で確認できる。

>>> print(plt.style.available)
['fivethirtyeight', 'ggplot', 'bmh', 'grayscale', 'dark_background']

Pythonista3にデフォルトで入ってるのは上記の5種類。今回は、ggplotを適用してみる。

スタイルの適用は、plt.style.use('ggplot')でする。

import matplotlib.pyplot as plt

datas1 = [10, 30, 20, 50, 40] #グラフにするデータ
datas2 = [40, 10, 50, 30, 20] #グラふに表示するデータその2
positions = range(1, 6) #x軸の位置
x_labels = ['A', 'B', 'C', 'D', 'E'] #x軸に表示するラベル

bar1 = plt.bar(positions, datas1, align = 'center') #datas1のグラフ
bar2 = plt.bar(positions, datas2, align = 'center', bottom = datas1, color = 'teal') #datas2のグラフ

plt.xticks(positions, x_labels) #x軸の値の変更
plt.ylim(0, 90) #y軸の表示範囲
plt.legend((bar1, bar2),('group1', 'group2')) #凡例の表示
plt.style.use('ggplot')
plt.show() #グラフの表示

グラフ7

これでだいぶ見栄えが良くなった。

タイトル

最後にグラフにタイトルをつけておく。グラフタイトルは、plt.title()でつけることができる。

import matplotlib.pyplot as plt

datas1 = [10, 30, 20, 50, 40] #グラフにするデータ
datas2 = [40, 10, 50, 30, 20] #グラふに表示するデータその2
positions = range(1, 6) #x軸の位置
x_labels = ['A', 'B', 'C', 'D', 'E'] #x軸に表示するラベル

bar1 = plt.bar(positions, datas1, align = 'center') #datas1のグラフ
bar2 = plt.bar(positions, datas2, align = 'center', bottom = datas1, color = 'teal') #datas2のグラフ

plt.xticks(positions, x_labels) #x軸の値の変更
plt.ylim(0, 90) #y軸の表示範囲
plt.legend((bar1, bar2),('group1', 'group2')) #凡例の表示
plt.style.use('ggplot')
plt.title('TEST', fontsize = 20)
plt.show() #グラフの表示

グラフ8

完成。

iPhoneだけでもちゃんとグラフを作ることが出来た。



Pythonの勉強を始めたばかりで、まだまだ分からないことだらけだけど、Pythonista3でいつでも何処でもPythonの勉強ができるのは嬉しい限り。


0 件のコメント :