2017-04-18 2 views
0

パンダとシーボーンを使用して「有効」で色相が変化する各チャンネル(inapp、email、push)の3つの時系列をプロットするにはどうすればよいですか?列はMultiIndexedであることに注意してください。私はプロットがy軸を共有し、 '有効'の値を示す共通の伝説を持っています。マルチインデックスデータフレームのファセットプロット

 
|---------|---------------|--------------|---------------| 
| channel | inapp   | email  | push   | 
| enabled | true | false | false | true | false | true | 
|---------|-------|-------|-------|------|-------|-------| 
| 0  | 0  | 80 | 28 | 0 | 5  | 0  | 
| 1  | 2  | 80 | 28 | 3 | 5  | 233 | 
| 2  | 4  | 80 | 28 | 7 | 5  | 587 | 
| 3  | 5  | 80 | 28 | 12 | 5  | 882 | 
| 4  | 7  | 86 | 28 | 16 | 5  | 1292 | 
|---------|-------|-------|-------|------|-------|-------| 
+0

'df.stack(レベル= 'チャンネル')。パイプ(seaborn.FacetGrid、...)。マップ(...)' –

+0

@PaulHあなたが提出することができますしてくださいとしてその私はまだそれを働かせていないので、答えは?あなたはアンドリューのコードを借りることができます。 – Emre

答えて

1

ここで(私もFacetGridでそれを把握することができませんでしたが)ポール・Hさん.stack()アプローチを使用して、別の方法です:
ここunstack()を使用して、よりコンパクトなバージョンだとfactorplot():UPDATE

import pandas as pd 
from matplotlib import pyplot as plt 

enabled = [True, False] 
channel =['inapp','email','push'] 
values = [0,2,4,5,7,80,80,80,80,86,28,28,28,28,28, 
      0,3,7,12,16,5,5,5,5,5,0,233,587,882,1292] 
values = np.array(values).reshape((5,6), order='F') 

columns = pd.MultiIndex.from_product([channel,enabled], names=("channel","enabled")) 
df = pd.DataFrame(values, columns=columns) 

fig, ax = plt.subplots(1,3,sharey=True) 

for i, (key, group) in enumerate(df.stack(level='channel').reset_index(level=1).groupby('channel')): 
    group.plot(label=key, title=key, ax=ax[i]) 


renameラインはプロットの明瞭さのためにそこにしかないので、それを取り除くことができます。

df = (df.unstack('enabled') 
     .reset_index() 
     .rename(columns={'level_2':'time',0:'value'}) 
) 
sns.factorplot(data=df, x='time', y='value', hue='enabled', col='channel') 

timeseries plot

+0

@この更新されたソリューションは、すべてのパラメータを満たす必要があります。これでも問題が解決しない場合は、不足していることを教えてください。 –

1

シーボーンは必要ない場合があります。
は、ここでは、指定したデータフレームを構築するコードです:あなたが参照している

時系列を想定すると
import pandas as pd 

enabled = [True, False] 
channel =['inapp','email','push'] 
values = [0,2,4,5,7,80,80,80,80,86,28,28,28,28,28, 
      0,3,7,12,16,5,5,5,5,5,0,233,587,882,1292] 
values = np.array(values).reshape((5,6), order='F') 

columns = pd.MultiIndex.from_product([channel,enabled], 
            names=("channel","enabled")) 
df = pd.DataFrame(values, columns=columns) 

channel inapp  email  push  
enabled True False True False True False 
0   0 80 28  0  5  0 
1   2 80 28  3  5 233 
2   4 80 28  7  5 587 
3   5 80 28 12  5 882 
4   7 86 28 16  5 1292 

は、インデックス値0-4で構成され、それがpyplotでサブプロットを作成するために許容できるかどうれます次のコードは、あなたの仕様を満たします:確かに

from matplotlib import pyplot as plt 

fig, ax = plt.subplots(1, 3, sharey=True) 
for i, col in enumerate(channel): 
    df.T.xs(col).T.plot(ax=ax[i], xticks=df.index, title=col) 

panel plot

を、移調は少し体操です。 groupby()を使って同じ効果を達成するためにパンダスの方法があるかもしれませんが、私はそれをちょっと試してみて解決策を見つけられませんでした。お役に立てれば。

関連する問題