2015-03-01 42 views
15

C'è un modo per tracciare una linea orizzontale infinita con Bokeh? I punti finali della linea non dovrebbero mai diventare visibili, indipendentemente da quanto l'utente stia effettuando lo zoom.Linea orizzontale infinita in Bokeh

Questo è quello che ho provato finora. Semplicemente scrive una tela vuota:

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) 

Un modo sarebbe quello di impostare i punti finali estremamente alte/basse e x_range della figura e y_range molto basso rispetto ad essi.

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) 

Tuttavia, spero che qualcuno ha una soluzione più elegante.

Edit: soluzione obsoleta rimosso

+1

Se si utilizza la linea per enfatizzare regioni di stampa diverse, potrebbe essere interessato al nuovo [BoxAnnotations] (http://bokeh.pydata.org/en/latest/docs/user_guide/plotting.html#box -annotations)! – jhin

+0

Ti preghiamo di considerare di cambiare la risposta accettata, sia "Span" che "BoxAnnotation" sono meglio della vecchia risposta accettata. – bigreddot

+0

Hai ragione. Entrambe le soluzioni funzionano alla grande. Ho scelto gli span perché penso che siano più "pensati per essere usati" per ciò che intendevo dei raggi infiniti, se questo ha senso. –

risposta

19

Siete alla ricerca di "campate":

Span (line-annotazioni di tipo) hanno un unico dimensione (larghezza o altezza) ed estendersi fino al bordo dell'area del grafico.

prega, dare un'occhiata a http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#spans

Quindi, il codice sarà simile:

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) 

Con questa soluzione gli utenti sono autorizzati a pan e zoom a piacimento. La fine delle linee non comparirà mai.

+0

Mi chiedo: linee, cerchi e altri glifi possono essere disegnati in base a una" fonte ". Possiamo alimentare un ColumnDataSource in questo. Questo ci consente di modificare ColumnDataSource e quindi creare grafici interattivi con un server Bokeh. La mia domanda: le annotazioni come Span funzionano allo stesso modo? In altre parole, posso spostare anche la linea verticale collegando il valore di "posizione" a un cursore? – Thornhale

3

Se si traccia due raggi a partire dalla metà non otterranno più piccoli come si esegue lo zoom avanti o indietro poiché la lunghezza è in pixel. Quindi, qualcosa di simile:

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

Ma se le pentole utente in entrambe le direzioni la fine del raggio apparirà. Se riesci a impedire all'utente di effettuare panoramiche (anche quando eseguono lo zoom), questo è un codice un po 'più bello per una linea orizzontale.

Se l'utente è in grado di eseguire lo zoom e fare una panoramica ovunque, è inutile (per quanto posso dire) ottenere una linea orizzontale come si descrive.

+0

Grazie!Con una piccola modifica, il raggio sta facendo il trucco. Sto modificando la mia domanda. Tuttavia, non è affatto elegante. –

+0

Ora questa risposta deve essere sostituita ora che 'Span' sono disponibili – bigreddot

7

Il Bokeh documentation on segments and rays indica la soluzione seguente (usando ray):

Per avere un raggio “infinito”, che si estende sempre al limite della trama , specificare 0 per la lunghezza.

E in effetti, il codice seguente produce un infinito, linea orizzontale:

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) 
Problemi correlati