web-dev-qa-db-fra.com

Ligne horizontale infinie à Bokeh

Existe-t-il un moyen de tracer une ligne horizontale infinie avec Bokeh? Les extrémités de la ligne ne doivent jamais devenir visibles, quelle que soit la distance de zoom de l'utilisateur.

C'est ce que j'ai essayé jusqu'à présent. Il imprime juste une toile vide:

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)

Une façon serait de définir les points d'extrémité extrêmement haut/bas et la plage x_range et y_range de la figure très petite par rapport à eux.

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)

Cependant, j'espère que quelqu'un a une solution plus élégante.

Modifier: suppression de la solution obsolète

21

Vous recherchez des "travées":

Les étendues (annotations de type ligne) ont une seule dimension (largeur ou hauteur) et s'étendent jusqu'au bord de la zone de traçage.

Veuillez consulter http://docs.bokeh.org/en/latest/docs/user_guide/annotations.html#spans

Ainsi, le code ressemblera à:

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)

Avec cette solution, les utilisateurs sont autorisés à effectuer un panoramique et un zoom à volonté. La fin des lignes n'apparaîtra jamais.

38
Daniel Perez-Gil

Le documentation Bokeh sur les segments et les rayons indique la solution suivante (en utilisant ray):

Pour avoir un rayon "infini", qui s'étend toujours jusqu'au bord du tracé, spécifiez 0 pour la longueur.

Et en effet, le code suivant produit une ligne horizontale infinie:

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)
10
jhin

Si vous tracez deux rayons à partir du milieu, ils ne deviendront pas plus petits lorsque vous effectuez un zoom avant ou arrière, car la longueur est en pixels. Donc quelque chose comme ça:

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

Mais si l'utilisateur fait un panoramique dans l'une ou l'autre direction, la fin du rayon apparaîtra. Si vous pouvez empêcher l'utilisateur de faire un panoramique (même lorsqu'ils zooment), alors c'est un code un peu plus agréable pour une ligne horizontale.

Si l'utilisateur est capable de zoomer et de faire un panoramique où bon lui semble, il n'y a pas de bon moyen (pour autant que je sache) d'obtenir une ligne horizontale comme vous le décrivez.

3
Alejandro

Si vous vous demandez comment utiliser des plages en combinaison avec des séries chronologiques, convertissez vos dates en horodatages 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)

Ou voir ce lien pour un exemple complet.

1
Guido