はてだBlog(仮称)

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

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

itdepends.hateblo.jp

の続きといいますか、「別紙」です。

先の記事では、matplotlib.pyplot.subplotsで複数グラフを一枚におさめる例を紹介しました。

しかし、ものぐさな私は、pandas.DataFrame.plotのaxパラメータにいちいち番地を指定するのはめんどくさいという気持ちになります。

よって、次のような関数というかオレオレscaffoldを定義して、グラフ描画で遊んでいます。


import pandas as pd
import matplotlib.pyplot as plt

# 複数グラフの枠を指定
_, axes = plt.subplots(4, 3,figsize=(20,15)) # 論理サイズ縦20 x 横15のマンションに、縦4 x 横3枠の部屋を確保

# デコレーター
def auto_ax(f):
    from functools import wraps # pandas.DataFrame.plot用には必要ないが、グラフ描画のちょいDSLを定義するためのデコレータに利用
    import numpy as np
    cnt = 0
    @wraps(f)
    def _(*args, **kwargs):
        nonlocal cnt
        f(*args, ax=axes.reshape(-1)[cnt], **kwargs)
        cnt = cnt + 1
        return cnt  # cntをreturnすることはグラフを描画する上では必須ではない。
    return _    

# plot関数のオレオレラッパー
@auto_ax
def myplot(df, kind, **kwargs):
    if kind :
        banchi_tsuuban = df.plot(kind=kind, **kwargs)

# EDAで遊ぶ部分 ------------

df = pd.read_csv('iris.csv').head(10)  # irisのデータ
myplot(df,'line')
myplot(df,'line',secondary_y=['SepalWidth'])
myplot(df,'bar')
myplot(df,'area')
myplot(df,'')
myplot(df,'bar', stacked=True)
myplot(df,'box')
myplot(df,'kde')
myplot(df,'scatter',x='SepalLength', y='SepalWidth')
myplot(df,'hist')
plt.show()

# ------------

irisのcsvファイルが必要ですが、それさえあれば、上記のコピペでこんなグラフが表示されます。

f:id:azotar:20200222123750p:plain

[補足] irisのデータ

github.com