有没有办法用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)
但是,我希望有人能有更优雅的解决方案。
编辑:删除过时的解决方案
答案 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以获取完整示例。