▶ カテゴリごとにプロットして比較する方法は以下をご覧ください。
▶ グラフのグリッド表示に関しては以下をご覧ください。
はじめに
今回はグラフの描画です。データの概要をつかむときには必ずグラフを描きますよね。通常、描くグラフは1つではなく、いくつも描くことが多いでしょう。さらに
描いたグラフを比較することではじめて何かがわかるのではないでしょうか?今回は複数のグラフをつぎつぎと描いて、それを比較する方法を学びましょう。
サンプルデータ
サンプルデータを作っていきましょう。どうぶつたちの月間購入回数のデータということにしましょう。まずは、ライブラリのインポートをします。
# ライブラリのインポート import pandas as pd import random import numpy as np import datetime as dt from dateutil.relativedelta import relativedelta import matplotlib.pyplot as plt import japanize_matplotlib %matplotlib inline
どうぶつたちの12か月間の月間購入回数のデータをつくることにします。どうぶつのリストをつくりましょう。
# どうぶつのリスト animals=['らくだ','ねこ','ぞう','らいおん','うさぎ','きりん'] animal_list=[animal for animal in animals for i in range(12)]
各どうぶつの12か月分のデータを作るので、どうぶつを1匹ずつ取り出してそれを12回栗加したanimal_listをつくっています。次に2020年度の「月」のリストをつくります。2020年4月~2021年3月までとします。表記は「月」のみとします。
# 月リスト date_list=[(dt.datetime(2020, 4, 1) + relativedelta(months=i)) for i in range(12)] month_list=[str(date.month)+'月' for date in date_list ]
次に購入回数のデータです。
# 購入回数データ data=np.array([random.randint(1, 3) for i in range(72)]) base=[3,3,1,2,1,2] base_list=[i for i in base for j in range(12)]
これらを組み合わせたデータフレームとしておきましょう。
# データフレームを作成 zoo_data=pd.DataFrame({'購入月':month_list*6, 'どうぶつ':[animal for animal in animals for i in range(12)], '購入回数':data+base_list}) zoo_data.head()
これでデータができました。このデータをグラフ化していきましょう。どうぶつごとに月次の購入回数がどのように推移しているか、をプロットすることにします。
グラフを並べて比較する
グラフを並べて描画する
どうぶつは、「らくだ」「ねこ」「ぞう」「らいおん」「うさぎ」「きりん」の6匹なので、6つの領域をつくることにします。2行3列の領域としましょう。
# どうぶつごとの描画領域をつくる ncols=3 nrows=2 fig,axes=plt.subplots(figsize=(6*ncols,5*nrows),ncols=ncols,nrows=nrows)
これで描画領域ができました。このままでも、各描画領域に(たとえば)axes[0,2](0行2列目の領域)のように指定できます。試してみましょう。
# どうぶつごとの描画領域をつくる ncols=3 nrows=2 fig,axes=plt.subplots(figsize=(6*ncols,5*nrows),ncols=ncols,nrows=nrows) # 0行2列目(pythonは0から数えるためで実際には1行3列目) axes[0,2].plot(zoo_data[zoo_data['どうぶつ']=='らくだ']['購入月'],zoo_data[zoo_data['どうぶつ']=='らくだ']['購入回数'])
ただ、繰り返し描画するときには〇行〇列の指定の仕方よりも、前から順に番号が振られている方が扱いやすいでしょう。numpyには多次元の1次元のリストにする関数ravelがあるのでこれを使いましょう。
# どうぶつごとの描画領域をつくる ncols=3 nrows=2 fig,axes=plt.subplots(figsize=(6*ncols,5*nrows),ncols=ncols,nrows=nrows) # 一次元のリスト化をする axes=np.ravel(axes) # 前から数えて2番目の領域に描画する axes[1].plot(zoo_data[zoo_data['どうぶつ']=='らくだ']['購入月'],zoo_data[zoo_data['どうぶつ']=='らくだ']['購入回数'])
このようにしておくと、繰り返し処理しやすいですね。描画したいのは、どうぶつごとに月間購入回数の描画ですから次のようにするとよいでしょう。
# どうぶつごとの描画領域をつくる ncols=3 nrows=2 fig,axes=plt.subplots(figsize=(6*ncols,5*nrows),ncols=ncols,nrows=nrows) # 一次元のリスト化 axes=np.ravel(axes) # どうぶつごとに描画する for i,animal in enumerate(zoo_data['どうぶつ'].unique()): axes[i].plot(zoo_data[zoo_data['どうぶつ']==animal]['購入月'],zoo_data[zoo_data['どうぶつ']==animal]['購入回数']) axes[i].set_xticklabels(labels=month_list,rotation=90) axes[i].grid() axes[i].set_title('<2020年度>\n%sの月間購入回数\n'%animal,fontsize=18) axes[i].set_ylabel('購入回数') axes[i].axhline(y=np.mean(zoo_data[zoo_data['どうぶつ']==animal]['購入回数']),linewidth=1,color='red') axes[i].set_ylim(0,7) # サブプロット間の間隔を調整 plt.subplots_adjust(wspace=0.3, hspace=0.6)
これで描画できました。やはり並べるとわかりやすいですね。らくだとねこが月間の購入回数が平均的に多く、ぞうとうさぎは少なそうです。
グラフを比較する
個数が少ない場合はこのままでも十分なのですが、グラフの数が多かったり、1つ1つのグラフが大きいとjupyter notebook上では比較しづらいことがあります。そのような場合には、画像として書き出してブラウザに表示させると比較しやすいです。最後に「fig.savefig(‘ファイルパス’)」を加えましょう。すると、画像として保存することができます。ここでは、「どうぶつたちの購入回数.png」というファイル名で、同一ディレクトリに保存することにしましょう。
# どうぶつごとの描画領域をつくる ncols=3 nrows=2 fig,axes=plt.subplots(figsize=(6*ncols,5*nrows),ncols=ncols,nrows=nrows) # 一次元のリスト化 axes=np.ravel(axes) # どうぶつごとに描画する for i,animal in enumerate(zoo_data['どうぶつ'].unique()): axes[i].plot(zoo_data[zoo_data['どうぶつ']==animal]['購入月'],zoo_data[zoo_data['どうぶつ']==animal]['購入回数']) axes[i].set_xticklabels(labels=month_list,rotation=90) axes[i].grid() axes[i].set_title('<2020年度>\n%sの月間購入回数\n'%animal,fontsize=18) axes[i].set_ylabel('購入回数') axes[i].axhline(y=np.mean(zoo_data[zoo_data['どうぶつ']==animal]['購入回数']),linewidth=1,color='red') axes[i].set_ylim(0,7) # サブプロット間の間隔を調整 plt.subplots_adjust(wspace=0.3, hspace=0.6) # 画像として保尊 fig.savefig('どうぶつたちの購入回数.png')
すると、同一フォルダ上に次のように画像ファイルが生成されます。
これをjupyter notebook上からクリックすると、そのままブラウザで表示することができます。こうすることで、ブラウザ上で拡大・縮小もできるのでグラフの数が多くても、比較しやすいです。
まとめ
いかがでしたか?たくさんのグラフを描くコツがわかったでしょうか?はじめに描画領域をつくったあと、np.ravelで一次元リスト化しておくと繰り返し処理がしやすいですね。また、グラフの量が多いとjupyter notebook上の表示では比較しにくいので、画像ファイルとして保存することも是非、覚えておきましょう。
▶ グラフを見やすく設定する記事をまとめています。下記からどうぞ。
コメント