【问题标题】:Plotting Weeks with Bokeh Datetime Axis用散景日期时间轴绘制周数
【发布时间】:2017-12-05 19:23:25
【问题描述】:

我正在尝试使用日期时间 x 轴从 Bokeh 制作条形图。我正在使用几种时间分辨率,除了几周之外,我可以让它们全部工作。我有一个看起来像这样的熊猫数据框(我添加了“周”列以供参考,它不应该保留)

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

Output with date

您可以看到标签未对齐并且有时会丢失。看起来 Bokeh 总是显示每月的第一天,无论它是否是一周的第一天。然后,这会将其他标签移出位置。我似乎找不到任何有助于做到这一点的文档。我也不能使用分类轴,因为我设置范围以仅显示 7 个最近的 bin 的方式会中断。我还尝试更改标签的格式以显示日历周标签,但也没有运气。关于如何让标签与适当的列匹配的任何想法?



    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)

【问题讨论】:

    标签: python datetime bokeh


    【解决方案1】:

    所以我想通了,发布以防其他人遇到类似问题。

    您需要修改 xaxis 上的 ticker 方法。当您的 x_axis_type 是日期时间时,Bokeh 会自动使用 DatetimeTicker method。这会找到最适合数据范围的类型,在本例中是 DaysTicker,它在每月的 1 日、8 日、15 日和 22 日添加刻度。这对于折线图或其他面积图来说很好,但要使其与周对齐,您需要强制刻度与条对齐。你可以这样做:

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

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

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

    【讨论】:

    • 我还发现您可以将 tiemdelta 传递给条形的“宽度”值,它将是日期时间轴上的正确宽度
    猜你喜欢
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2016-07-29
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多