使用Bokeh Datetime轴绘制周数

3

我正在尝试使用Bokeh创建一个带有日期时间x轴的条形图。 我使用了几个时间分辨率,除了周之外,其他都可以正常工作。 我有一个类似这样的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)

1个回答

6

我已经解决了这个问题,发帖是为了让其他人有类似的问题时能够参考。

你需要修改x轴上的ticker方法。当你的x_axis_type是datetime类型时,Bokeh自动使用DatetimeTicker方法。这会找到最适合数据范围的类型,这种情况下是一个DaysTicker,它会在每个月的1号、8号、15号和22号添加刻度。对于线图或其他面积图来说这很好,但要让它与周对齐,则需要强制刻度与条形图对齐。你可以通过以下方式实现:

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

或者将您的日期时间字段转换为毫秒时代整数(10 ** 6是因为numpy日期时间以纳秒为单位),然后添加 output.xaxis.ticker = FixedTicker(ticks = tickers)

这会强制刻度与条形图中心对齐。这样,无论如何重新采样数据框,标签都会自动匹配。


1
我还发现你可以将一个时间差传递给柱状图的'widths'值,它会在日期时间轴上正确显示宽度。 - Benaiah2320

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接