2016-05-17 184 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个地块的情节。在x轴的垂直线的间隔是这样的:

wrong vertical spacing

通知如何,例如,十一月比腊宽(因此它不是仅仅天的各月的数目)。显然这是由于每个月的数据点数量,而不是每个月的天数。任何建议,以适当的时间正确的月份开始/月底的垂直线间隔?这是一个错误?

回答

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()