在Bokeh的无限水平线

时间:2015-03-01 18:28:24

标签: python plot line bokeh

有没有办法用Bokeh绘制无限水平线? 无论用户缩放多远,线的端点都不应该变得可见。

这是我迄今为止所尝试过的。它只是打印一个空画布:

import bokeh.plotting as bk
import numpy as np

p = bk.figure()
p.line([-np.inf,np.inf], [0,0], legend="y(x) = 0")
bk.show(p)

一种方法是将端点设置为极高/低,并且数字x_range和y_range相对于它们非常小。

import bokeh.plotting as bk
import numpy as np

p = bk.figure(x_range=[-10,10])
p.line([-np.iinfo(np.int64).max, np.iinfo(np.int64).max], [0,0], legend="y(x) = 0")
bk.show(p)

但是,我希望有人能有更优雅的解决方案。

编辑:删除过时的解决方案

4 个答案:

答案 0 :(得分:27)

您正在寻找“跨度”:

  

Spans(线型注释)具有单个维度(宽度或高度)并延伸到绘图区域的边缘。

请看一下 http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#spans

所以,代码看起来像:

import numpy as np
import bokeh.plotting as bk
from bokeh.models import Span

p = bk.figure()

# Vertical line
vline = Span(location=0, dimension='height', line_color='red', line_width=3)
# Horizontal line
hline = Span(location=0, dimension='width', line_color='green', line_width=3)

p.renderers.extend([vline, hline])
bk.show(p)

使用此解决方案,用户可以随意平移和缩放。线的末尾永远不会出现。

答案 1 :(得分:9)

Bokeh documentation on segments and rays表示以下解决方案(使用ray):

  

拥有一条“无限”光线,它总是延伸到光线的边缘   plot,为长度指定0。

实际上,下面的代码会生成一条无限的水平线:

import numpy as np
import bokeh.plotting as bk
p = bk.figure()
p.ray(x=[0], y=[0], length=0, angle=0, line_width=1)
p.ray(x=[0], y=[0], length=0, angle=np.pi, line_width=1)
bk.show(p)

答案 2 :(得分:3)

如果您从中间绘制两条光线,则在放大或缩小时它们不会变小,因为长度以像素为单位。所以像这样:

p.ray(x=[0],y=[0],length=300, angle=0, legend="y(x) = 0")
p.ray(x=[0],y=[0],length=300, angle=np.pi, legend="y(x) = 0")

但是如果用户向任一方向平移,则会显示光线的末端。如果你可以防止用户完全平移(即使他们放大),那么对于水平线来说这是一个更好的代码。

如果用户能够在他们喜欢的任何地方进行缩放和平移,那么就没有好办法(据我所知)获得你所描述的水平线。

答案 3 :(得分:0)

如果您想知道如何结合时间序列使用跨度,请将日期转换为unix时间戳:

start_date = time.mktime(datetime.date(2018, 3, 19).timetuple())*1000
vline = Span(location=start_date,dimension='height', line_color='red',line_width=3)

或者查看this link以获取完整示例。