我试图通过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语句的工作脚本,并且使用一个模拟的数据帧来测试它,那么下次会更好.花了一些时间来整理它.但我正在学习散景这样很好:)
Don*_*ndo 12
抱歉没有发表评论,我没有足够的声誉。
@Alex 接受的答案对我不起作用(Bokeh 2.0.1),因为它在格式化程序中缺少简单的 @-sign。工作代码是这样的:
HoverTool(tooltips=[('date', '@DateTime{%F}')],
formatters={'@DateTime': 'datetime'})
Run Code Online (Sandbox Code Playgroud)