2015-05-13 18 views
5

Sono nuovo per bokeh e ho appena saltato dritto usando hovertool perché è per questo che volevo usare bokeh in primo luogo. Adesso sto tracciando dei geni e quello che voglio ottenere è costituito da più linee con la stessa coordinata y e quando si passa sopra una linea si ottiene il nome e la posizione di questo gene.Bokeh hovertool in plot multiplo

Ho provato a imitare l'esempio this, ma per qualche motivo non riesco nemmeno a visualizzare le coordinate.

Sono sicuro che se qualcuno che in realtà conosce il modo per aggirare bokeh guarda questo codice, l'errore sarà evidente e sarei molto grato se me lo mostrassero.

from bokeh.plotting import figure, HBox, output_file, show, VBox, ColumnDataSource 
from bokeh.models import Range1d, HoverTool 
from collections import OrderedDict 
import random 

ys = [10 for x in range(len(levelsdf2[(name, 'Start')]))] 
xscale = zip(levelsdf2[('Log', 'Start')], levelsdf2[('Log', 'Stop')]) 
yscale = zip(ys,ys) 

TOOLS="pan,wheel_zoom,box_zoom,reset,hover" 
output_file("scatter.html") 
hover_tips = levelsdf2.index.values 
colors = ["#%06x" % random.randint(0,0xFFFFFF) for c in range(len(xscale))] 

source = ColumnDataSource(
    data=dict(
     x=xscale, 
     y=yscale, 
     gene=hover_tips, 
     colors=colors, 
    ) 
) 


p1 = figure(plot_width=1750, plot_height=950,y_range=[0, 15],tools=TOOLS) 
p1.multi_line(xscale[1:10],yscale[1:10], alpha=1, source=source,line_width=10, line_color=colors[1:10]) 

hover = p1.select(dict(type=HoverTool)) 
hover.tooltips = [ 
    ("index", "$index"), 
    ("(x,y)", "($x, $y)"), 
] 

show(p1) 

il levelsdf2 è un pandas.DataFrame, se è importante.

risposta

3

L'ho capito da solo. Si scopre che la versione 0.8.2 di Bokeh non consente l'hovertool per le linee, quindi ho fatto la stessa cosa usando i quad.

from bokeh.plotting import figure, HBox, output_file, show, VBox, ColumnDataSource 
from bokeh.models import Range1d, HoverTool 
from collections import OrderedDict 
import random 


xscale = zip(levelsdf2[('series1', 'Start')], levelsdf2[('series1', 'Stop')]) 
xscale2 = zip(levelsdf2[('series2', 'Start')], levelsdf2[('series2', 'Stop')]) 
yscale2 = zip([9.2 for x in range(len(levelsdf2[(name, 'Start')]))],[9.2 for x in range(len(levelsdf2[(name, 'Start')]))]) 

TOOLS="pan,wheel_zoom,box_zoom,reset,hover" 
output_file("linesandquads.html") 
hover_tips = levelsdf2.index.values 
colors = ["#%06x" % random.randint(0,0xFFFFFF) for c in range(len(xscale))] 
proc1 = 'Log' 
proc2 = 'MazF2h' 
expression1 = levelsdf2[(proc1, 'Level')] 
expression2 = levelsdf2[(proc2, 'Level')] 
source = ColumnDataSource(
    data=dict(
     start=[min(xscale[x]) for x in range(len(xscale))], 
     stop=[max(xscale[x]) for x in range(len(xscale))], 
     start2=[min(xscale2[x]) for x in range(len(xscale2))], 
     stop2=[max(xscale2[x]) for x in range(len(xscale2))], 
     gene=hover_tips, 
     colors=colors, 
     expression1=expression1, 
     expression2=expression2, 

    ) 
) 


p1 = figure(plot_width=900, plot_height=500,y_range=[8,10.5],tools=TOOLS) 
p1.quad(left="start", right="stop", top=[9.211 for x in range(len(xscale))], 
     bottom = [9.209 for x in range(len(xscale))], source=source, color="colors") 

p1.multi_line(xscale2,yscale2, source=source, color="colors", line_width=20) 


hover = p1.select(dict(type=HoverTool)) 

hover.tooltips = OrderedDict([ 
    (proc1+" (start,stop, expression)", "(@start| @stop| @expression1)"), 

    ("Gene","@gene"), 
]) 

show(p1) 

Funziona come un fascino.

MODIFICA: Aggiunta un'immagine del risultato, come richiesto e modificato codice per abbinare lo screenshot pubblicato.

Hovertool for lines - workaround using quads

Non è la soluzione migliore, come si scopre che non è tutto così facile tracciare diverse serie di quad su una trama. Probabilmente è possibile ma, dato che non ha avuto molta importanza nel mio caso d'uso, non ho indagato troppo vigorosamente.

Dato che tutti i geni sono rappresentati su tutte le serie nello stesso punto, ho aggiunto solo i suggerimenti per tutte le serie ai quad e ho tracciato le altre serie come grafici multi linea sulla stessa figura.

Ciò significa che se si alzava il mouse sulla riga superiore in 9.21, si otterrebbero anche i suggerimenti per la riga in 9.2, ma se si passasse con il mouse sulla riga 9.2 non si otterrebbe affatto un suggerimento.

+0

Puoi anche pubblicare l'immagine della tua trama. Perché interpretarlo dal codice mi sembra difficile. Sono nella stessa situazione in questo momento. Questa domanda è salva la vita per me. – mousecoder

+0

Sarebbe stata un'opzione per tracciare semplicemente più linee singole, come ad es. dato in questo snippet di codice? https://github.com/bokeh/bokeh/issues/3454#issuecomment-168238796 – osdf