如何为 Bokeh BoxAnnotation 使用 X 轴上的日期时间限制?
How can I use datetime limits on X-Axis for Bokeh BoxAnnotation?
我想将 BoxAnnotation 添加到具有日期时间 x 轴的图中。如何将 BoxAnnotation 的左右限制设置为日期时间或日期对象。这就是我的目标,但它不起作用。
from bokeh.sampledata.glucose import data
from bokeh.models import BoxAnnotation
from datetime import *
# output_file("box_annotation.html", title="box_annotation.py example")
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
#reduce data size
data = data.ix['2010-10-06':'2010-10-13']
p = figure(x_axis_type="datetime", tools=TOOLS)
p.line(data.index.to_series(), data['glucose'],
line_color="gray", line_width=1, legend="glucose")
left_box = BoxAnnotation(plot=p, right=date(2010,10,7), fill_alpha=0.1, fill_color='blue')
mid_box = BoxAnnotation(plot=p, left=date(2010,10,8), right=date(2010,10,9), fill_alpha=0.1, fill_color='yellow')
right_box = BoxAnnotation(plot=p, left=date(2010,10,10), fill_alpha=0.1, fill_color='blue')
p.renderers.extend([left_box, mid_box, right_box])
p.title = "Glucose Range"
p.xgrid[0].grid_line_color=None
p.ygrid[0].grid_line_alpha=0.5
p.xaxis.axis_label = 'Time'
p.yaxis.axis_label = 'Value'
show(p)
当前的 BoxAnnotation 实现仅接受 NumberSpec 类型(浮点数和整数)作为输入。当前的解决方法是将您的日期时间对象转换为时间戳(并将其缩放为 1e3,因为 Bokeh 内部使用微秒精度,而不是毫秒)
所以它喜欢:(使用 python3 datetime.timestamp
方法)
from datetime import datetime as dt
...
left_box = BoxAnnotation(plot=p, right=dt(2010,10,7).timestamp()*1000, fill_alpha=0.1, fill_color='blue')
mid_box = BoxAnnotation(plot=p, left=date(2010,10,8).timestamp()*1000, right=date(2010,10,9).timestamp()*1000, fill_alpha=0.1, fill_color='yellow')
right_box = BoxAnnotation(plot=p, left=date(2010,10,10).timestamp()*1000, fill_alpha=0.1, fill_color='blue')
p.renderers.extend([left_box, mid_box, right_box])
...
添加对日期时间对象作为参数的支持似乎是一项有价值的功能。我已经打开了一个 Github 问题,你可以评论 on/follow:
Bokeh 现在支持框注释的时间戳!
import pandas as pd
...
left_box = BoxAnnotation(plot = p, right = pd.to_datetime('2010-10-07'), fill_alpha=0.1, fill_color='blue')
...
这适用于散景 0.12.9,并且 Python >2.7。
我想将 BoxAnnotation 添加到具有日期时间 x 轴的图中。如何将 BoxAnnotation 的左右限制设置为日期时间或日期对象。这就是我的目标,但它不起作用。
from bokeh.sampledata.glucose import data
from bokeh.models import BoxAnnotation
from datetime import *
# output_file("box_annotation.html", title="box_annotation.py example")
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
#reduce data size
data = data.ix['2010-10-06':'2010-10-13']
p = figure(x_axis_type="datetime", tools=TOOLS)
p.line(data.index.to_series(), data['glucose'],
line_color="gray", line_width=1, legend="glucose")
left_box = BoxAnnotation(plot=p, right=date(2010,10,7), fill_alpha=0.1, fill_color='blue')
mid_box = BoxAnnotation(plot=p, left=date(2010,10,8), right=date(2010,10,9), fill_alpha=0.1, fill_color='yellow')
right_box = BoxAnnotation(plot=p, left=date(2010,10,10), fill_alpha=0.1, fill_color='blue')
p.renderers.extend([left_box, mid_box, right_box])
p.title = "Glucose Range"
p.xgrid[0].grid_line_color=None
p.ygrid[0].grid_line_alpha=0.5
p.xaxis.axis_label = 'Time'
p.yaxis.axis_label = 'Value'
show(p)
当前的 BoxAnnotation 实现仅接受 NumberSpec 类型(浮点数和整数)作为输入。当前的解决方法是将您的日期时间对象转换为时间戳(并将其缩放为 1e3,因为 Bokeh 内部使用微秒精度,而不是毫秒)
所以它喜欢:(使用 python3 datetime.timestamp
方法)
from datetime import datetime as dt
...
left_box = BoxAnnotation(plot=p, right=dt(2010,10,7).timestamp()*1000, fill_alpha=0.1, fill_color='blue')
mid_box = BoxAnnotation(plot=p, left=date(2010,10,8).timestamp()*1000, right=date(2010,10,9).timestamp()*1000, fill_alpha=0.1, fill_color='yellow')
right_box = BoxAnnotation(plot=p, left=date(2010,10,10).timestamp()*1000, fill_alpha=0.1, fill_color='blue')
p.renderers.extend([left_box, mid_box, right_box])
...
添加对日期时间对象作为参数的支持似乎是一项有价值的功能。我已经打开了一个 Github 问题,你可以评论 on/follow:
Bokeh 现在支持框注释的时间戳!
import pandas as pd
...
left_box = BoxAnnotation(plot = p, right = pd.to_datetime('2010-10-07'), fill_alpha=0.1, fill_color='blue')
...
这适用于散景 0.12.9,并且 Python >2.7。