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

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

Это то, что я пробовал до сих пор. Он просто печатает пустой холст:

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)

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

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


person Tobias Hotzenplotz    schedule 01.03.2015    source источник
comment
Если вы используете линию, чтобы выделить разные области графика, вас могут заинтересовать новые BoxAnnotations!   -  person jhin    schedule 02.10.2015
comment
Пожалуйста, рассмотрите возможность изменения принятого ответа, либо Span, либо BoxAnnotation лучше, чем старый принятый ответ.   -  person bigreddot    schedule 26.01.2016
comment
Ты прав. Оба решения отлично работают. Я выбрал пролеты, потому что я думаю, что они больше предназначены для того, что я задумал, чем бесконечные лучи, если это имеет смысл.   -  person Tobias Hotzenplotz    schedule 28.01.2016


Ответы (4)


Вы ищете "промежутки":

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

Пожалуйста, взгляните на 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)

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

person Daniel Perez-Gil    schedule 26.01.2016
comment
Мне интересно: линии, круги и другие глифы можно рисовать на основе источника. Мы можем передать ColumnDataSource в это. Это позволяет нам изменить ColumnDataSource и, таким образом, создавать интерактивные графики с сервером Bokeh. Мой вопрос: работают ли аннотации, такие как Span, одинаково? Другими словами, могу ли я также перемещать вертикальную линию, связывая значение местоположения с ползунком? - person Thornhale; 06.07.2017

Документация по боке по сегментам и лучам указывает на следующее решение (с использованием 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)
person jhin    schedule 17.08.2015

Если вы построите два луча из середины, они не станут меньше при увеличении или уменьшении масштаба, поскольку длина указана в пикселях. Что-то вроде этого:

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

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

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

person Alejandro    schedule 01.03.2015
comment
Спасибо! С небольшой модификацией луч делает свое дело. Я редактирую свой вопрос. Однако это совсем не элегантно. - person Tobias Hotzenplotz; 02.03.2015
comment
Этот ответ должен быть заменен теперь, когда доступны Spans - person bigreddot; 26.01.2016

Если вам интересно, как использовать диапазоны в сочетании с временными рядами, преобразуйте даты в временные метки 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)

Или см. полный пример по этой ссылке.

person Guido    schedule 19.03.2018