2015-05-13 86 views
5

我是新來的散景,我剛剛跳進了使用hovertool,因爲這就是爲什麼我想首先使用散景。 現在我正在繪製基因,我想要實現的是具有相同y座標的多條線,當您將鼠標懸停在一條線上時,您將獲得該基因的名稱和位置。multiple_line plot散景hovertool

我試圖模仿this的例子,但由於某種原因,我甚至無法讓它顯示座標。

我敢肯定,如果有人真正知道他們解決散景的問題,那麼這個錯誤就會顯而易見,如果他們向我展示這些錯誤,我會非常感激。

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) 

levelsdf2是一個pandas.DataFrame,如果它很重要的話。

回答

3

我想出了我自己的想法。事實證明,Bokeh 0.8.2版本不允許hovertool用於線條,所以我使用四邊形做了同樣的事情。

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) 

工程就像一個魅力。

編輯:添加了結果的圖片,作爲請求和編輯的代碼來匹配發布的屏幕截圖。

Hovertool for lines - workaround using quads

事實證明它不是那麼容易積幾大系列四邊形的一個情節這不是最好的解決辦法。這可能是可能的,但因爲在我的使用案例中,我並沒有太大的調查力度。

由於所有基因都在同一位置的所有系列中表示,我只是將所有系列的工具提示添加到四邊形,並將其他系列繪製爲同一圖上的多線圖。

這意味着如果你在9.21的頂端行上懸停,你也可以在9.2行獲得工具提示,但是如果你在9.2行上徘徊,你根本得不到工具提示。

+0

你也可以發佈你的情節的圖片。因爲從代碼中解釋它似乎很難。我現在處於同樣的境地。這個問題對我來說是生命的救星。 – mousecoder

+0

是否可以簡單地繪製多條單線,如在此代碼片段中給出? https://github.com/bokeh/bokeh/issues/3454#issuecomment-168238796 – osdf