Бесконечная горизонтальная линия в Боке

Есть ли способ построить бесконечную горизонтальную линию с 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)

Однако я надеюсь, что у кого-то есть более элегантное решение.

Изменить: удалить устаревшее решение

Ответы

Ответ 1

Вы ищете "пролеты":

Пролеты (линейные аннотации) имеют одно измерение (ширину или высоту) и простираются до края области графика.

Пожалуйста, посмотрите на 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)

С помощью этого решения пользователям разрешается панорамирование и масштабирование по желанию. Конец строк никогда не появится.

Ответ 2

В документации 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)

Ответ 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")

Но если пользователь поворачивается в любом направлении, появится конец луча. Если вы можете вообще запретить пользователю панорамирование (даже при масштабировании), это немного более удобный код для горизонтальной линии.

Если пользователь может масштабировать и панорамировать в любом месте, пожалуйста, нет хорошего пути (насколько я могу судить), чтобы получить горизонтальную линию, как вы описываете.

Ответ 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)

Или посмотрите эту ссылку для полного примера.