Bokeh runtimeerror, как добавить всплывающие подсказки к графику?

Я пытаюсь добавить всплывающие подсказки к ранее составленному сюжету:

enter image description here

По оси абсцисс отложены позиции маркеров, по оси ординат - позиции генов. Подсказки в настоящее время пусты

Но когда я пытаюсь добавить их, я получаю RuntimeError.

Для построения графика я использую df, который содержит координаты маркера и гена (соответственно xmar и xgen) и значения LOD. Эти три столбца взяты из трех отдельных списков (xmar, ygen и value):

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 снова состоит из трех списков (marname, genname и value):

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
0
0
1 218
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сообщение об ошибке содержит всю информацию об ошибке использования, а также информацию о том, как что-то исправить:

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

Вы передали source методу глифов, но вы также передали реальные списки для x=xmar и y=ygen.

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

Как говорится в ошибке, это недопустимо. Если передать source глифу, все для глипа должно происходить из источника. Вы не можете смешивать и сочетать. Итак, вы должны поместить xmar и ygen в качестве столбцов в вашем ColumnDataSource, а затем настроить x и y для использования этих столбцов:

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

Вы можете добавить эти столбцы «вручную» в словарь source.data, или вы можете добавить столбцы в свой фрейм данных перед вызовом ColumnDataSource(DFvalue)

Ответ принят как подходящий

Ваш ColumnDataSource построен на основе DFvalue, но вы пытаетесь получить данные всплывающей подсказки от DFname. Думаю, если вы включите другие данные в свой ColumnDataSource:

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

Вы можете указать желаемые данные в TOOLTIP.

Другие вопросы по теме