matplotlibでファンネルチャートを表示したい

プロダクトのデータだと利用の落ち状態をみるのにファンネルごとの観測数や比率を一枚のグラフで表したいことがあります。

棒グラフや折れ線でも一応みえるのですが、matplotlibでファンネルチャートがつくれないか試してみます。

試してみる

データの用意

今回はファンネルごとの観測数が集計されたという前提から始めてみます。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "funnel":['a','b','c','d'],
        "value":[80,60,40,35]
    }
)

グラフの描画

matplotlibにはfillという座標を渡すとそれをつないで塗りつぶしてくれるメソッドがあるのでそれを使います。

実際の値と、一つ後の値をdf.shit(-1)で用意し、データの数だけ、y座標用のデータも渡して描画します。

cnt = df.shape[0]
for s,e in zip(df['value'],df['value'].shift(-1)):
  if e is None:
    plt.fill([s,s,-1*s,-1*s],[cnt,cnt-1,cnt-1,cnt])
  else:
    plt.fill([s,e,-1*e,-1*s],[cnt,cnt-1,cnt-1,cnt])
  cnt-=1

f:id:esu-ko:20200907223401p:plain

もう少し工夫してみます。

cnt = df.shape[0]
for s,e in zip(df['value'],df['value'].shift(-1)):
  if np.isnan(e) :
    plt.fill([s,s,-1*s,-1*s],[cnt,cnt-0.7,cnt-0.7,cnt])
  else:
    plt.fill([s,s,e,-1*e,-1*s,-1*s],[cnt,cnt-0.7,cnt-1,cnt-1,cnt-0.7,cnt])
  cnt-=1

f:id:esu-ko:20200907223428p:plain