2016-05-17 10 views
0

私は時間軸がインデックスとして設定されたパンダのデータフレームを持っています。次のコードをプロットするときseaborn/matplotlibのx軸を時間軸で正しく配置する方法は?

%matplotlib inline 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
import seaborn as sns; sns.set(); 
ids = [1,2,3,4] 
dates = pd.date_range('20150704', '20160331') 
vals = np.random.randn(len(ids)*len(dates)) 
allids = np.tile(ids, len(dates)) 
alldates = np.tile(dates, len(ids)) 
df = (pd.DataFrame(np.vstack((allids, vals)).T, index=alldates) 
    .reset_index().rename(columns={'index':'datetime',0:'unique_id',1:'height'})) 

time_group = '1w' 
threshold = 0.50 

fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12, 16), sharex=True) 

for (i, temp), ax in zip(df.groupby('unique_id'), axes.ravel()): 
    (temp.set_index('datetime').height 
     .groupby(pd.TimeGrouper(time_group)) 
     .mean() 
     .plot(ax=ax)) 

プロットは4つのプロットがあります。

wrong vertical spacing

例えば、11月は12月よりも広くなっているか、注意してください(そう、それは単に、各月の日数ではありません):x軸上の縦線の間隔は次のようになります。明らかに、これは、毎月のデータポイントの数ではなく、各月のデータポイントの数によるものです。垂直線を月の始まり/終わりと時間的に適切に間隔を置くようにするための提案はありますか?これはバグですか?

答えて

0

1Wは毎月の日曜日に基づいてグループ化され、日曜日には他の日曜日と比較していくつかの月があります...そのため、いくつかの月がより広いです。以下の変更が役立ちます。

%matplotlib inline 
    import matplotlib.pyplot as plt 
    import numpy as np 
    import pandas as pd 
    import matplotlib.dates as mdates 
    import seaborn as sns; sns.set(); 
    ids = [1,2,3,4] 
    dates = pd.date_range('20150704', '20160331') 
    vals = np.random.randn(len(ids)*len(dates)) 
    allids = np.tile(ids, len(dates)) 
    alldates = np.tile(dates, len(ids)) 
    df = (pd.DataFrame(np.vstack((allids, vals)).T, index=alldates) 
     .reset_index().rename(columns={'index':'datetime',0:'unique_id',1:'height'})) 
    time_group = '1w' 
    threshold = 0.50 

    fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12, 16), sharex=True) 


    for (i, temp), ax in zip(df.groupby('unique_id'), axes.ravel()): 
     b=(temp.set_index('datetime').height 
      .groupby(pd.TimeGrouper(time_group)) 
      .mean()) 
     ax.plot(b.index,b) 
     ax.xaxis.set_major_formatter(mdates.DateFormatter('%b')) 
    plt.show() 
関連する問題