在Bokeh的无限水平线

Tob*_*otz 19 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)
Run Code Online (Sandbox Code Playgroud)

一种方法是将端点设置为极高/低,并且数字的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)
Run Code Online (Sandbox Code Playgroud)

但是,我希望有人有一个更优雅的解决方案.

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

小智 32

您正在寻找"跨度":

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

请查看 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)
Run Code Online (Sandbox Code Playgroud)

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

  • 我想知道:线条、圆圈和其他字形可以根据“源”来绘制。我们可以将 ColumnDataSource 输入其中。这使我们能够更改 ColumnDataSource,从而使用 Bokeh 服务器创建交互式绘图。我的问题:像 Span 这样的注释是否以同样的方式工作?换句话说,我可以通过将“位置”的值链接到滑块来移动垂直线吗? (2认同)

jhi*_*hin 9

关于段和光线Bokeh文档指出以下解决方案(使用ray):

要获得"无限"光线,它始终延伸到绘图的边缘,请为长度指定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)
Run Code Online (Sandbox Code Playgroud)


Ale*_*dro 6

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

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")
Run Code Online (Sandbox Code Playgroud)

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

如果用户能够在任何地方缩放和平移,那么就没有好的方法(据我所知)来获得您所描述的水平线。