5-4.Excelにはできない体裁のグラフ
前節で作ってきた程度のグラフはエクセルでも出来ます.しかし,データ数が膨大になるとエクセルではグラフ作成が出来ないためプログラムによる作図の出番になります.また,Matplotlibに慣れてしまえばわざわざエクセルを介さずに図を書けるというメリットもあります.
しかし,Matplotlibを使う利点はこれだけではありません.Matplotlibでないと出来ないことやMatplotlibでないと面倒なことが多々あります.ここでは,そのいくつかを紹介しましょう.
しかし,Matplotlibを使う利点はこれだけではありません.Matplotlibでないと出来ないことやMatplotlibでないと面倒なことが多々あります.ここでは,そのいくつかを紹介しましょう.
(1) 何個ものグラフを一度に作成する
プログラムベースで作図を行うMatplotlibなら何個ものグラフを一気に作成することが出来ます.例えば,同じ時系列のデータを折れ線グラフとして地点ごとに作成するようなケースです.オブジェクト指向ライティングで説明したように,MatplotlibではFigオブジェクトにおいて指定したグリットにグラフであるAxesオブジェクトを配置できます.これを利用すると地点ごとの系列データを一気にグラフ化出来ます.
例題として,25地点の時系列データを5×5の折れ線グラフに表現するとしましょう.まずはimportやFigureオブジェクトの生成を行います.
例題として,25地点の時系列データを5×5の折れ線グラフに表現するとしましょう.まずはimportやFigureオブジェクトの生成を行います.
>>> import numpy as np >>> from numpy.random import randint >>> fig = plt.figure(figsize=(10,10))
次にnp.random.randintで25地点における20年分のランダムなデータとx軸となる20年分の整数順列を作ってみましょう.
>>> data = randint(0,100,(25,20+1)) >>> x = list(range(0,20+1))
ここからが肝です.生成したdata配列の1行を1地点と捉え,それを順次25地点まで別々のグラフにプロットしていきます.使用する関数はfig.add_subplot(a,b,c)です.これは,説明したようにa×bにグラフを分割した際のc番目にグラフを生成するというものでした.ということは,5×5のグラフ空間を定義してそこにグラフを順番に生成していけばいいのです.
- for i in range (0,25):
- ax = fig.add_subplot(5,5,i+1)
- ax.plot(x,data[i],color=”k”)
-
そして,いつもどおりに体裁を整えていきます.また,どの地点だかが分かるように各グラフにタイトルax.set_title()で入れましょう.
- for i in range (0,25):
- ax = fig.add_subplot(5,5,i+1)
- ax.plot(x,data[i],color=”k”)
- ax.tick_params(direction="in",right="on",top="on",which="both")
- ax.set_xlabel("Year")
- ax.set_ylabel("demand")
- ax.set_xlim([0,20])
- ax.set_ylim([0,100])
- ax.set_title("Point"+str(i+1))
-
この時点のグラフをplt.show()で出力してみましょう.この時点では様々な問題が残されていることが分かります.問題は以下のとおりです.
[修正前のグラフ]

(1) x軸の目盛ラベルとグラフタイトルが重なっている
(2) x軸の軸タイトルが下のグラフと重なって無くなっている
(3) y軸の目盛ラベルと隣のグラフが重なっている
(4) y軸の軸タイトルが隣のグラフが重なっている
(5) x軸の目盛が一つしかない
(2) x軸の軸タイトルが下のグラフと重なって無くなっている
(3) y軸の目盛ラベルと隣のグラフが重なっている
(4) y軸の軸タイトルが隣のグラフが重なっている
(5) x軸の目盛が一つしかない
(1)と(2)に関しては,xは最下行,つまり5行目だけにx軸の目盛ラベルや軸タイトルがあれば十分なはずです.また,(3)と(4)も最前列である1行目に目盛ラベルや軸タイトルがあれば十分なはずです.これらを実行するには不要な行の目盛ラベルを削除し,不要な行の軸タイトルは挿入しないというアクションが必要になります.(5)に関しては有名なAxes.set_○ticksオプションがあります.目盛ラベルを削除するにはAxes.axis.set_ticklabels([])という記法が有名です.
matplotlib.axes.set_○ticks(list[,minor=False])
指定した○軸にlistに応じた軸目盛を挿入します.minorオプションはminorticksを使用するかどうかを指定します.
指定した○軸にlistに応じた軸目盛を挿入します.minorオプションはminorticksを使用するかどうかを指定します.
- for i in range (0,25): #The way of thinking #答えはp.113にあります
- ax.set_xticks((range(0,20+1,5))) #0,5,10,15,20
- if i - 20 >= 0: #20,21,22,23,24 = True = bottom row
- ax.set_xlabel("Year")
- else:
- ax.xasis.set_ticklabels([])
- if i % 5 ==0: # 0,5,10,15,20 = True = First column
- ax.set_ylabel(“demand”)
- else:
- ax.yaxis. set_ticklabels([])
-
[修正後のグラフ]

これらの修正により実用に耐えうるグラフ集が完成しました.このようにして地点ごとの時系列データを可視化し,視覚的な比較を可能にすることで可視化する前は見えなかった地点ごとの特徴などが発見され,論文などの考察をより良いものにしてくれるでしょう.
最終的なコードをfive_five.pyとして実行してみましょう.
最終的なコードをfive_five.pyとして実行してみましょう.
five_five.py
- from numpy.random import randint
- import matplotlib.pyplot as plt
- fig = plt.figure(figsize=(10,10))
- data = randint(0,100,(25,20+1))
- x = list(range(0,20+1))
- for i in range (0,25):
- ax = fig.add_subplot(5,5,i+1)
- ax.plot(x,data[i],color="k")
- ax.tick_params(direction="in",right=True,top=True,which="both")
- ax.set_xlim([0,20])
- ax.set_ylim([0,100])
- ax.set_title("Point"+str(i+1))
- ax.set_xticks((range(0,20+1,5)))
- if i - 20>=0: #20,21,22,23,24 = True = bottom row
- ax.set_xlabel("Year")
- else:
- ax.xaxis.set_ticklabels([])
- if i % 5 ==0: # 0,5,10,15,20 = True = First column
- ax.set_ylabel("demand")
- else:
- ax.yaxis.set_ticklabels([])
-