📊

データアナリストがよく使うmatplotlibのスニペット

2024/10/30に公開

はじめに

データアナリストとして日々データ分析を行っています。
普段の分析業務では、SQLでデータ集計を完了させてデータフレームとして出力し、Python(matplotlib)でグラフ描画する、という流れで作業しています。そのため、Pythonを利用する際はmatplotlibのコードを書くことが多いです。

matplotlibを用いた描画について、簡単なグラフであれば特に難しくないかと思いますが、少し凝ったことをしようと思うと、文法を都度調べることになるかと思います。特に最近では生成AIを利用する人も多いでしょう。

自分は生成AIが流行る前から業務でコードを書いていたため、ある程度の可視化コードは空で書けるというのもありますが、下記で紹介するスニペットツールを利用しているおかげで、検索や生成AIを利用しなくてもそれなりの速さで可視化を行うことが出来ています。

今回は私が普段の業務でよく使うmatplotlibのスニペットをまとめてみました。

スニペット管理ツール

スニペット集に入る前に、スニペット管理/呼び出しツールを紹介します。
私はスニペット管理ツールとして、Clipyを利用しています。クリップボードのコピー履歴を数十件保持できる便利ツールとして有名ですが、スニペット管理ツールとしても利用することができます。

https://github.com/Clipy/Clipy

自分は cmd + shift + v でClipyを呼び出すように設定しており、これによりコピペと同じ操作感でスニペットを貼り付けることができます。
これから紹介するmatplotlibのコードだけでなく、頻出のSQLやPythonのちょっとした処理(日付に関する処理など)を登録しています。生産性が上がるのでオススメです。

スニペット

パラメータのデフォルト設定

matplotlibでは文字サイズやグラフのスタイルなど、デフォルトのパラメータを弄ることが出来ます。
デフォルトでは文字が小さいことが多いので、自分は以下のような設定を行っております。

https://matplotlib.org/stable/users/explain/customizing.html

import matplotlib.pyplot as plt
from matplotlib import rcParams

rcParams['legend.fontsize'] = 'large'
rcParams['axes.titlesize'] = 'xx-large'
rcParams['xtick.labelsize'] = 'large'
rcParams['ytick.labelsize'] = 'large'
rcParams['axes.labelsize'] = 'large'
rcParams['figure.dpi'] = 100

複数のグラフを作成する

一度に複数のKPIの推移を確認したい時に使います。

# 縦, 横のグラフの数と1枚あたりの大きさを指定
nrows = 2
ncols = 3
h = 4
w = 6

# グラフを指定の数作成
fig, axes = plt.subplots(nrows, ncols, figsize=(ncols * w, nrows * h))
axes = axes.flatten()
rcParams['figure.constrained_layout.use'] = True

例えば、ABテストの効果測定で、複数のKPIについて2群のKPI時系列推移と、KPI差分の時系列推移をplotしたいようなケースを想定します。
こちらのスニペットを利用すると以下のように書くことができます。
(SQLで縦持ちなデータを取得してきた想定のコードになります。)

df = execute('''
...

select
    test_group
    , dt
    , sum(sales) as sum_sales
    , sum(profit) as sum_profit
from
    agg
group by
    test_group
    , dt
order by
    test_group
    , dt
;
''')


kpis = ['sum_sales', 'sum_profit']

nrows = len(kpis)
ncols = 2
h = 4
w = 6

fig, axes = plt.subplots(nrows, ncols, figsize=(ncols * w, nrows * h))
rcParams['figure.constrained_layout.use'] = True

for ax1, ax2 in axes:
    p = pd.pivot_table(
        data=df
        , index='dt'
        , columns='test_group'
        , values=kpi
    )
    p.plot(ax=ax1)
    ax1.set_title(f'{kpi}時系列推移')
    
    (p.iloc[:, 1] - p.iloc[:, 0]).plot(ax=ax2)
    ax2.set_title(f'{kpi}差分時系列推移\n(test - control)')

Y軸をカンマ区切りで表示する

売上などの大きい数を扱う場合、デフォルトでは指数表記のラベルが表示されますが、そのままレポーティングに利用するのは難しいでしょう。
以下のようなコードでカンマ区切りで表示することができます。

fig, ax = plt.subplots(1, 1)
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))

plt.plot(df['dt'], df['sales'])

X軸のラベルを90度回転する

pyplot なインターフェースであれば、plt.xticks(rotation=90) ですが、Axes オブジェクトを利用した可視化の場合は、 ax.tick_params で設定します。

ax.tick_params(axis='x', labelrotation=90)
DMM Data Blog

Discussion