Бесконечная горизонтальная линия в Боке
Есть ли способ построить бесконечную горизонтальную линию с 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)
Или посмотрите эту ссылку для полного примера.