はてだBlog(仮称)

私的なブログど真ん中のつもりでしたが、気づけばWebサイト系のアプリケーション開発周りで感じたこと寄りの自分メモなどをつれづれ述べています。2020年6月現在、Elasticsearch、pandas、CMSなどに関する話題が多めです。...ですが、だんだんとより私的なプログラムのスニペット置き場になりつつあります。ブログで述べている内容は所属組織で販売している製品などに関するものではなく、また所属する組織の見解を代表するものではありません。

Pandasのplot関数で複数の別種類のグラフをまとめて一枚に表示(pylot.subplots関数、axパラメータなど)

この記事の目的/概要

itdepends.hateblo.jp

上記の記事で、Pandasのplotの簡単なまとめをしました。見栄えの工夫やより高度な可視化にはいろいろ探求の道があると思いますが、私の場合、見栄えよりも次に必要になったのは、折れ線グラフ版、棒グラフ版などといった複数グラフバリエーションを一枚画像への配置したいということでした。

例えば次のようなものです。

f:id:azotar:20200222112810p:plain

一枚画像への配置なんて、必要ならそれぞれのグラフをコピペしたりすれば良いのでは?、少なくともPandasのplotの学習の中で後回しで良さそう...なんですが、個人的には違いました。

実際に高度かプリミティブか、派手か地味かはともかく、グラフによる可視化は、同じ可視化でもフェーズによって多少位置付けが異なるのではないでしょうか。

  1. EDAの最初期のそもそも何のデータなのかを俯瞰するとともに、どの種類のグラフを使えば俯瞰しやすいか自体の見定め
  2. EDAの深い分析の過程での可視化
  3. 報告のための(装飾も含めた)仕上げ

実のところ私の場合は、EDAの高尚なことには関わっていない(苦笑)ので、手軽に1ができれば良いということが一番多く、複数グラフへの一枚画像への簡単にプロットする方法が必要(世間の人もそうなのでは?)と思って、せっかくなので、先の記事の続編としてこの記事をまとめました。

Pandas.DataFrame.plotでの複数グラフまとめて表示

...と前置きが長いですが、簡単にいうと

  • matplotlib.pyplot.plt のsubplots関数を使う
  • matplotlib.plyplotにおける、Figure、Axesの概念
  • plot関数のaxパラメータを指定

あたりがポイントになっており、深い理解や使いこなしはともかく、一旦これらのポイントをうっすら意識して次を写経いただければ、複数グラフを1枚画像にまとめて表示できます。

コード例を見てもらう方が早いので、Pythonプログラムの具体例です。

import pandas as pd
import matplotlib.pyplot as plt
import io   # 可視化には必要ないが、この例を簡潔にしめすため、StringIOを利用

pesedo_csv = io.StringIO("""
val1,val2,str
4,25,あああ
5,20,いいい
6,15,ううう
7,10,えええ
8,5,おおお
""" )
df = pd.read_csv(pesedo_csv)

_, axes = plt.subplots(4, 3,figsize=(20,15)) # 論理サイズ縦20 x 横15のマンションに、縦4 x 横3枠の部屋を確保
df.plot.line(ax=axes[3, 1])
plt.show()


これで、次のグラフが表示されます。

f:id:azotar:20200222113504p:plain

解説

subplots関数は、グラフの描画領域を確保していると理解すれば良いでしょう。

おおよそ次のように理解すれば良いと思います。

f:id:azotar:20200222112953p:plain

ここで、axesは、Numpyのndarrayらしいのですが、それはひとまずおいておいて、確保したグラフ領域の表示したい番地を「 [3,1] 」などのように指定できると理解しておけば、とりあえずも目的は果たせそうです。

また、番地自体は、plot関数のaxキーワード引数に渡してやれば、plot関数がよろしくやってくれるので、df.plot(kind='line', ax=axes[3,1])などとしてやれば良いでしょう。

この関係のイメージは次の図のようになります。

f:id:azotar:20200222113011p:plain

以上です。

ちょっとだけ続きあり↓

itdepends.hateblo.jp