Bokeh RuntimeError,如何添加工具提示以进行绘制?

时间:2018-10-31 13:24:25

标签: python plot hover tooltip bokeh

我正在尝试将工具提示添加到我之前绘制的图中:

enter image description here

在x轴上是标记位置,在y轴上包含基因位置。工具提示当前为空

但是当我尝试添加它们时,出现RuntimeError。

对于绘图,我使用一个df,其中包含标记和基因坐标(分别为xmarxgen)和LOD值。这三列来自三个单独的列表(xmarygenvalue):

DFvalue = pd.DataFrame({'xmar':xmar, 'ygen':ygen, 'value':value})

   xmar  ygen     value
0     0   402  5.075381
1     0   708  4.619449
2     1   489  3.817142
3     1   652  4.396806
4     2   500  3.662211

,并使用另一个名称而不是坐标的df(链接到工具提示?)。此df再次由三个列表(marnamegennamevalue)组成:

DFname = pd.DataFrame({'xname':marname, 'yname':genname, 'value':value})

      xname      yname     value
0  c1_00593  AT1G05430  5.075381
1  c1_00593  AT1G05900  4.619449
2  c1_00600  AT1G07790  3.817142
3  c1_00600  AT1G08230  4.396806
4  c1_00789  AT1G08920  3.662211

我用于绘图的代码如下,我想ColumnDataSource()出了点问题,但是我看不到为什么或如何?

TOOLS= "hover,pan,wheel_zoom,zoom_in,zoom_out,box_zoom,undo,redo,reset,save"
SOURCE = ColumnDataSource(DFvalue)
TOOLTIPS = [
    ('gene', '@genname'),
    ('marker', '@marname'),
    ('LOD score', '@value')
]

 #Create figure
 p = figure(tools=TOOLS, tooltips=TOOLTIPS)
 p.xaxis.axis_label = 'Position genes'
 p.yaxis.axis_label = 'Position markers'


 p.circle(x=xmar, y=ygen, source=SOURCE, size=6, fill_alpha=0.8)

运行后,我收到以下错误:

p.circle(x=xmar, y=ygen, source=SOURCE, size=6, fill_alpha=0.8)
File "fakesource", line 5, in circle
File "C:\Anaconda3\lib\site-packages\bokeh\plotting\helpers.py", line 757, in func
raise RuntimeError(_GLYPH_SOURCE_MSG % nice_join(incompatible_literal_spec_values, 
conjuction="and"))
RuntimeError: 

Expected x and y to reference fields in the supplied data source.

When a 'source' argument is passed to a glyph method, values that are sequences
(like lists or arrays) must come from references to data columns in the source.

For instance, as an example:

source = ColumnDataSource(data=dict(x=a_list, y=an_array))

p.circle(x='x', y='y', source=source, ...) # pass column names and a source

Alternatively, *all* data sequences may be provided as literals as long as a
source is *not* provided:

p.circle(x=a_list, y=an_array, ...)  # pass actual sequences and no source

2 个答案:

答案 0 :(得分:0)

错误消息包含有关使用错误的所有信息,以及有关如何解决问题的信息:

  

将x和y用作提供的数据源中的参考字段。

     

将“源”参数传递给字形方法时,   序列(如列表或数组)必须来自对数据的引用   源中的列。

     

例如,

     

source = ColumnDataSource(data = dict(x = a_list,y = an_array))

     

p.circle(x ='x',y ='y',source = source,...)#传递列名和   来源

     

或者,所有数据序列可以按原义提供,例如   只要未提供 来源,

     

p.circle(x = a_list,y = an_array,...)#传递实际序列而没有   来源

您将source传递给字形方法,但是您还传递了x=xmary=ygen的真实列表。

p.circle(x=xmar, y=ygen, source=SOURCE, size=6, fill_alpha=0.8)

由于错误状态,这是不允许的。如果将source传递给字形,则字形的所有内容都应来自源代码。您不能混搭。因此,必须将xmarygen作为列放在ColumnDataSource中,然后将xy配置为使用这些列:

p.circle(x='xmar', y='ygen', source=SOURCE, size=6, fill_alpha=0.8)

您可以手动将这些列添加到source.data字典中,也可以在调用ColumnDataSource(DFvalue)之前将列添加到数据框中

答案 1 :(得分:0)

您的ColumnDataSource是从DFvalue构建的,但是您正在尝试从DFname获取工具提示数据。 我想如果您在ColumnDataSource中包含其他数据:

SOURCE = ColumnDataSource(data=dict(
    xmar=DFvalue['xmar'],
    ymar=DFvalue['ygen'],
    value=DFvalue['value']
    marname=DFname['xname']
    genname=DFname['yname']))

您可以在TOOLTIP中指向所需的数据。

相关问题