【すぐに使える】matplotlibで複合グラフ(棒と折れ線)を簡単に描くクラスを作ってみました。

当ページのリンクには広告が含まれています。

1つのグラフに折れ線と棒グラフを同時に描きたい場合があります。Excelだと画面から簡単に設定できるのですが、matplotlib の場合は設定が多くて結構面倒です。

そこで、簡単に棒グラフと折れ線グラフを描画できるクラスを作ってみました。Y軸は2軸にも対応しています。

個人的に必要と思う設定はパラメータで変更できるようにしていますが、グラフのデザインは人ぞれぞれですし、使うシーンによっても変わってきますので、必要に応じてカスタマイズしてお使いください。

コピー&ペーストで簡単に張り付けられるようになっています。

matplotlib について詳しい内容が知りたい方は、こちらの記事をご一読下さい。

目次

クラスを使って作れるグラフ

以下の通り、折れ線グラフ、棒グラフ、積み上げ棒グラフ、折れ線+棒グラフ、折れ線+積み上げ棒グラフが可能で、Y軸は1軸と2軸に対応しています。

X軸は数値、文字列、日付型に対応しています。

クラスの使い方

PlotHelperのインスタンスを生成し、add_x メソッドでX軸の値を、add_y メソッドでY軸の値を登録し、最後に show メソッドを呼びます。

実は、X軸が1~始まる連番でよければ add_x メソッドも省略できますが、一応記載しておきます。

必要最小限の引数を使ってグラフを書いた場合のサンプルは次の通りです。

リファレンス

説明コンストラクタ
呼び出し方PlotHelper(title='',width=None,height=None,facecolor=None,backcolor=None,
     linewidth=3,edgecolor=None,islegend=True,position='upper right'):
引数title:str   タイトル
width:int   ウィンド横サイズ(インチ単位)
height:int   ウィンド縦サイズ(インチ単位)
facecolor:str ウインドウの背景色
edgewidth:int グラフ外形枠の太さ
edgecolor:str グラフ外形枠の色
backcolor:str グラフ背景色
islegend:bool   凡例の表示/非表示設定
戻り値無し
説明X軸軸に表示する数値(int,float)を設定する。
※ラベルを設定する場合は add_label メソッドを使う。
このメソッドを省略した場合、1から始まる連番が自動的に設定される。
呼び出し方add_X(vals)
引数vals:list[int,float]    X軸の値のリスト
戻り値無し
説明X軸軸に表示するラベルを設定する。
※数値を指定する場合は add_x メソッドを使う
呼び出し方add_label(label)
引数label:list    ラベルのリスト (例 ['label1,'label2'])
戻り値無し
説明X軸の数値/ラベルの表示に関する仕様を設定する。
X軸の値が日付型の場合、表示フォーマット('%Y/%m/%d'等)を設定する。
呼び出し方axis_formatter(step,rotation=0,formatter='')
引数rotation:int X軸の角度
step:int X軸の間隔
formatter:str X軸のフォーマット(X軸データが日付の時)
戻り値無し
説明X軸、Y軸のタイトルを設定する。
呼び出し方axis_title(x_title,y1_title,y2_title = '')
引数x_title:str    X軸のタイトル
y1_title:str    Y1軸のタイトル
y2_title:str    Y2軸のタイトル
戻り値無し
説明Y軸の値を登録する。
charttypeを省略するか 'plot' を指定した場合は折れ線グラフが、
'bar' を指定した場合は棒グラフが表示される。
2個以上の ’bar' でデータを登録すると、自動的に積み上げグラフとなる。
axis を省略するか'left'を指定した場合は1軸(左側)に描画され、
'right'を指定した場合は2軸(右側)に表示される。
呼び出し方add_y(label,vals,chart_type='plot',linewidth=2,linestyle=None,
color=None,markersize=0,marker='o',markerfacecolor=None,axis='left')
引数label:str  ラベル values:[int],[float] Y軸にプロットする値のリスト
charttype:str チャートタイプ 'plot' 又は 'bar'を指定可能
linewidth:int 折れ線の太さ
linestyle:str 折れ線の種類 (例:'-','--')
color:str 折れ線の色
markersize:int マーカーサイズ
marker:str マーカーの形状
markerfacecolor:str マーカーの色(例:'red','b')
axis:str Y軸の指定 'left' は左軸、'right' は右軸を使用
戻り値無し
説明指定したXの位置に縦線を描画する
呼び出し方vline(width=2,linestyle='-',color=None)
引数x:int,float          X軸の値
linewidth:int          線の太さ
linestyle:str          線の種類  (例:'-','--')
color:str              線の色     
戻り値なし
説明指定したYの位置に横線を描画する
呼び出し方hline(width=2,linestyle='-',color=None)
引数y:int,float          y軸の値
linewidth:int          線の太さ
linestyle:str          線の種類  (例:'-','--')
color:str              線の色  
戻り値なし
説明X軸、Y軸で指定したデータを使ってグラフを表示する
呼び出し方show()
引数なし
戻り値なし
説明X軸、Y軸で指定したデータを使ってグラフを作成し、ファイルに保存する。
呼び出し方save(filename)
引数filename:str    グラフを保存するファイル名。拡張子によってグラフのフォーマットを指定。
戻り値なし

では、これを使った複合グラフについて、実際のグラフイメージを例に解説していきます。

X軸を文字列ラベルにした複合グラフ(折れ線+棒グラフ)

X軸をラベル(文字列)にしたい場合、add_label メソッドにリスト形式で文字列をセットします。

 pl.add_label(['東京','神奈川','新潟','静岡','愛知','大阪','京都','兵庫','三重',' 愛媛','岡山','熊本'])

折れ線、棒グラフの指定は pl.add_y メソッドの charttype 引数で指定します。

X軸を日付にした2軸の複合グラフ(折れ線+積み上げ棒グラフ)

X軸に日付や時刻のデータを指定したい場合は、下記の様に add_x でdatetime型のデータを渡し、axis_formatter メソッドで表示するフォーマットを指定します。

 pl.add_x([datetime.datetime(2020,10,1) ,datetime.datetime(2020,10,1),・・・])

 pl.axis_formatter(2,30,'%Y/%m/%d')

積み上げグラフは pl.add_y(~,'bar') を複数実行することで作成できます。

X軸を数値にした3軸の複合グラフ(折れ線+積み上げ棒グラフ)

3軸目を指定したい場合は、add_y メソッドの axis引数に 'right' を指定します。

  pl.add_y(x,y,axis='right')

クラスのソースコード

以下が今回のクラスのソースコードになります。

汎用性を追求しすぎるとソースコードが複雑になり、第三者が手を加えづらくなるため、個人的に必要と思う機能のみに絞っています。

不足している機能があれば、随時追加して頂ければと思います。

ソースのポイント

今回はソースコードの中に記述してしまいましたが、変更できるようメソッド化した方が良かったかもと思う点や、修正する上での補足説明について記載しておきます。

デザインと描画を担当するメソッド(__desine、 __draw) について

add_x、add_y メソッドで指定されたデータは一旦リストに格納し、__draw メソッドで読み出しながらグラフを描画しています。

また、グラフの体裁(Figure の生成、subplotの生成、グリッド線、2軸3軸の設定、グラフの上下左右マージンなど)に関するものは __desine の中に納めています。

もし新しいグラフ(グルーピング棒グラフなど)を追加する場合は、__draw メソッドに手を加えてください。

また、グリッド線の表示非表示をメソッドの引数で制御したい場合や、新たに補助線を描画したい場合、4軸目を設定したい場合は、__desineメソッドの中を修正してください。

グラフ表示エリアのマージン設定

3軸目を表示した場合、右側のマージンに余裕がなくなると思います。

_design メソッドの中にマージンを設定する記述があります。

  plt.subplots_adjust(left=0.12,right=0.92,top=0.92,bottom=0.2)

ここは好みに合わせて設定してください。

今回はこの値を設定するメソッドを作っていませんが、例えば set_adjust というメソッドを追加し、引数を subplots_adjust に渡すようにすれば、メソッド経由で変更が可能になります。

yの3軸以降の追加

必要なケースは少ないと思いますが、Y軸を3軸に増やしたい場合は、下記の記述で増やすことが可能です。

self.axis_y3= self.axis_y1.twinx()

 self.axis_y3.spines['right'].set_position(('axes',1.15))

1行目は、axis_y1.twinx() の戻り値を新しい3軸(axis_y3)にセットします。

4軸、5軸と増やす場合、この方法でY軸を増やすことが可能です。

ただし、軸は同じ場所に描画されるので、3軸目以降が重なって表示されます。

そこで、2行目で軸の表示位置をずらしています。

今は1.15にしていますが、軸毎に適切な値を設定する必要があります。

下記は、4軸目まで増やした場合のサンプルになります。

まとめ

今回は折れ線、棒グラフ、積み上げグラフの複合グラフを簡単に描画できるクラスについて紹介しました。

特に棒グラフは描画するのが面倒ですので、このクラスを使うと非常に簡単に描画できます。

グラフの体裁(補助線の有無や色、線種、グラフの上限下限の設定、ラベル凡例のデザインなど)については人それぞれ違うので、手を加えやすいよう考慮したつもりです。

クラスはコピペで使えるようになっていますので、もしご自身のニーズに合うものがあれば、是非ご活用下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次