【问题标题】:Infinite horizontal line in Bokeh散景中的无限水平线
【发布时间】:2015-05-02 01:39:51
【问题描述】:

有没有办法用 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)

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

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

【问题讨论】:

  • 如果您使用线条来强调不同的绘图区域,您可能会对新的BoxAnnotations 感兴趣!
  • 请考虑更改接受的答案,SpanBoxAnnotation 比旧接受的答案更好。
  • 你是对的。两种解决方案都很好用。我选择跨度是因为我认为它们比无限光线更“适合”用于我的意图,如果这有任何意义的话。

标签: python plot line bokeh


【解决方案1】:

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

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")

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

如果用户能够随心所欲地进行缩放和平移,那么(据我所知)没有什么好的方法可以得到您所描述的水平线。

【讨论】:

  • 谢谢!稍加修改,光线就可以解决问题。我正在编辑我的问题。但是,它一点也不优雅。
  • 既然Spans 可用,这个答案应该被取代
【解决方案2】:

Bokeh documentation on segments and rays 表示以下解决方案(使用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)

【讨论】:

    【解决方案3】:

    您正在寻找“跨度”:

    跨度(线型注释)具有单一尺寸(宽度或高度)并延伸到绘图区域的边缘。

    请看一下 http://docs.bokeh.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)
    

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

    【讨论】:

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

    如果您想知道如何将跨度与时间序列结合使用,请将您的日期转换为 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 获取完整示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2017-04-21
      • 2012-09-29
      • 2013-03-27
      • 1970-01-01
      相关资源
      最近更新 更多