Python:Bokeh悬停日期时间

Yas*_*eem 5 python bokeh

我试图通过Python中的Bokeh获得一个线条图.我是Bokeh的新手,我正试图在情节上应用悬停工具提示.绘图的x轴具有Timestamp值,将其转换为epoch字符串.我在这里回顾了一些相同的问题,并尝试使用我的案例的解决方法,但它似乎不起作用.在情节中,它给出???了时间应该出现的地方.

对我的代码有什么建议吗?

时间戳采用格式 2016-12-29 02:49:12

也有人可以告诉我如何格式化x-axis刻度以垂直显示?

p = figure(width=1100,height=300,tools='resize,pan,wheel_zoom,box_zoom,reset,previewsave,hover',logo=None)
p.title.text = "Time Series for Price in Euros"
p.grid.grid_line_alpha = 0
p.xaxis.axis_label = "Day"
p.yaxis.axis_label = "Euros"
p.ygrid.band_fill_color = "olive"
p.ygrid.band_fill_alpha = 0.1
p.circle(df['DateTime'],df['EuP'], size=4, legend='close',
  color='darkgrey', alpha=0.2)
p.xaxis.formatter = DatetimeTickFormatter(formats=dict(
hours=["%d %B %Y"],
days=["%d %B %Y"],
months=["%d %B %Y"],
years=["%d %B %Y"],
))

source = ColumnDataSource(data=dict(time=[x.strftime("%Y-%m-%d %H:%M:%S")for x in df['DateTime']]))
hover = p.select(dict(type=HoverTool))
hover.tooltips = {"time":'@time', "y":"$y"}
hover.mode = 'mouse'
p.line(df['DateTime'],df['EuP'],legend='Price',color='navy',alpha=0.7)
Run Code Online (Sandbox Code Playgroud)

Ale*_*ice 16

由于这个答案最初发布,新的工作已经进入Bokeh,使事情变得更简单.日期时间字段可以通过悬停工具直接格式化为日期时间,方法是指定格式化程序,例如:

HoverTool(tooltips=[('date', '@DateTime{%F}')],
          formatters={'DateTime': 'datetime'})
Run Code Online (Sandbox Code Playgroud)

不再需要预先格式化数据源中的日期字段,如下所示.有关更多信息,请参阅格式化工具提示字段


老答案:

您的工具提示的问题是您使用日期的字符串表示创建了一个源,但p.line()调用不知道它.所以你必须传入一个包含工具提示,x和y值的columndatasource.

以下是代码的工作变体:

from bokeh.plotting import figure, show
from bokeh.models.formatters import DatetimeTickFormatter
from bokeh.models import ColumnDataSource
from bokeh.models.tools import HoverTool
import pandas as pd
import numpy as np

data = {
    'DateTime' : pd.Series(
        ['2016-12-29 02:49:12',
        '2016-12-30 02:49:12',
        '2016-12-31 02:49:12'],
        dtype='datetime64[ns]'),
    'EuP' : [20,40,15]
}
df = pd.DataFrame(data)
df['tooltip'] = [x.strftime("%Y-%m-%d %H:%M:%S") for x in df['DateTime']]
p = figure(width=1100,height=300,tools='resize,pan,wheel_zoom,box_zoom,reset,previewsave,hover',logo=None)
p.title.text = "Time Series for Price in Euros"
p.grid.grid_line_alpha = 0
p.xaxis.axis_label = "Day"
p.yaxis.axis_label = "Euros"
p.ygrid.band_fill_color = "olive"
p.ygrid.band_fill_alpha = 0.1
p.circle(df['DateTime'],df['EuP'], size=4, legend='close',
  color='darkgrey', alpha=0.2)
p.xaxis.formatter = DatetimeTickFormatter(formats=dict(
 hours=["%d %B %Y"],
 days=["%d %B %Y"],
 months=["%d %B %Y"],
 years=["%d %B %Y"],
))
hover = p.select(dict(type=HoverTool))
tips = [('when','@tooltip'), ('y','$y')]
hover.tooltips = tips
hover.mode = 'mouse'
p.line(x='DateTime', y='EuP', source=ColumnDataSource(df),
       legend='Price',color='navy',alpha=0.7)
show(p)
Run Code Online (Sandbox Code Playgroud)

另请注意,散景工具提示中缺少格式化选项存在一个未解决的问题.可能有一种更简单的方法可以不将datetring作为单独的列格式化:

https://github.com/bokeh/bokeh/issues/1239

也有人可以告诉我如何格式化x轴刻度以垂直显示?

他们看起来很好,对不起,我无法帮助.

希望这可以帮助!

PS如果你发布一个带有import语句的工作脚本,并且使用一个模拟的数据帧来测试它,那么下次会更好.花了一些时间来整理它.但我正在学习散景这样很好:)

  • 对日期和时间使用 `{%F %T}`。 (5认同)

Don*_*ndo 12

抱歉没有发表评论,我没有足够的声誉。

@Alex 接受的答案对我不起作用(Bokeh 2.0.1),因为它在格式化程序中缺少简单的 @-sign。工作代码是这样的:

HoverTool(tooltips=[('date', '@DateTime{%F}')],
          formatters={'@DateTime': 'datetime'})
Run Code Online (Sandbox Code Playgroud)