簡體   English   中英

使用Bokeh Datetime Axis繪制周數

[英]Plotting Weeks with Bokeh Datetime Axis

我正在嘗試使用日期時間x軸從Bokeh制作條形圖。 我正在使用幾個時間的解決方案,除了幾周之外,我可以讓它們全部工作。 我有一個看起來像這樣的pandas數據框(我添加了'Week'列供參考,它不應該留下)

Timestamp   ResultID
2017-12-03  106
2017-11-26  381
2017-11-19  406
2017-11-12  662
2017-11-05  656
2017-10-29  638
2017-10-22  429
2017-10-15  784

輸出日期

您可以看到標簽未對齊,有時會丟失。 看起來Bokeh總是顯示一個月的第一天,無論它是否是一周的第一天。 然后將其他標簽移出位置。 我似乎無法找到任何有助於這樣做的文檔。 我也不能使用分類軸,因為我設置范圍的方式只顯示最近的7個分箱會中斷。 我也嘗試更改標簽的格式以顯示日歷周標簽,但也沒有運氣。 有關如何使標簽與相應列匹配的任何想法?



    bintime = 'W'
    bins = {'h' : '%Y-%m-%d %H:%M', 'D' : '%F', 'W' : '%F', 'M' : '%Y-%m'}
    widths = {'h' : 3600000, 'D' : 86400000, 'W' : 604800000, 'M' : 2419200000}
    pad = 0.9

    source = ColumnDataSource(df)

    now = np.datetime64(datetime.datetime.now())

    if bintime == 'M':
        padspace = now + np.timedelta64(1*30, 'D')
        dispdelta = now - np.timedelta64(7*30, 'D')
    else:
        padspace = now
        dispdelta = now - np.timedelta64(7, bintime)

    ranges = ['hours', 'days', 'months']

    #xrange = df.DT.tolist()
    xrange = (dispdelta, padspace)

    output = figure(plot_height=300, width=800, title="MPL Output", x_range=xrange, tools ='xpan,reset,xzoom_in,xzoom_out')
    output.vbar(x='Timestamp', top='ResultID', width=widths[bintime]*pad, source=source)
    output.xaxis.formatter=DatetimeTickFormatter(hours=bins[bintime], days=bins[bintime], months=bins[bintime])
    show(output)

所以我想出來,以防萬一其他人有類似的問題。

您需要修改xaxis上的ticker方法。 當您的x_axis_type是日期時間時,Bokeh會自動使用DatetimeTicker方法 這將找到最適合數據范圍的類型,在本例中是一個DaysTicker,它在該月的第1天,第8天,第15天和第22天添加刻度。 這對於線條或其他區域圖表來說可能沒問題,但是為了使它與需要強制刻度線與條形線對齊的周數對齊。 你可以這樣做:

tickers = pd.to_datetime(df.index.values).astype(int) / 10**6

或者將你的日期時間字段轉換為ms epoch整數(10 ** 6是因為numpy日期時間是以納秒為單位),然后添加output.xaxis.ticker = FixedTicker(ticks = tickers)

這會強制刻度線與條形中心對齊。 這樣,無論您重新采樣數據幀,標簽都會自動匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM