Всплывающая подсказка не работает для Bokeh визуализации графика Networkx - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь создать график с использованием Networkx и рендеринга графика с помощью Bokeh. Кажется, что все работает, за исключением всплывающей подсказки, с которой я справился Подсказки к данным в Bokeh не показывают данные, показывая «???» вместо этого , всплывающая подсказка Bokeh, отображающая не все данные - блокнот Ipython , и чтение документации на ColumnDataSource, но я все еще не могу понять, почему подсказки не будут отображать метки из одного из столбцов мой фрейм данных.

Ниже приведено слишком упрощенное представление данных из файла Excel, с которыми я поигрался.

group    subtopic    code
fruit    grapes      110A
fruit    apple       110B
meat     pork        220A
meat     chicken     220B
meat     duck        220C
vegetable lettuce    300A
vegetable tomato     310A
vegetable asparagus  320A

Я попытался запустить следующий код:

df = pd.read_excel(file1, sheetname = 'Sheet3')

reshape = []

for i, j, in df.iterrows():
    for _, k in df.iterrows():
        if (j['code'] == k['code']):
            pass
        elif j['group'] == 'nan':
            reshape.append({'code1':j['code'],
                       'code2': j['code'],
                       'group': 'None'})
        elif (j['group'] == k['group']):
            reshape.append({'code1': j['code'],
                       'code2': k['code'],
                       'group': j['group']})
        else:
            pass
df1 = pd.DataFrame(reshape)

g = nx.from_pandas_edgelist(df1, source='code1', target='code2', edge_attr = True)


source = ColumnDataSource(df)

TOOLTIPS = [("type", "@group"),("code", "@code1")]

plot = Plot(x_range = Range1d(-1.1,1.1), y_range = Range1d(-1.1,1.1))
plot.title.text = 'Bokeh Plot'

plot.add_tools(HoverTool(tooltips = TOOLTIPS), TapTool(), BoxSelectTool(), 
 WheelZoomTool())

graph_renderer = from_networkx(g, nx.spring_layout, scale = 1, center = (0,0))

# manipulating nodes
graph_renderer.node_renderer.glyph = Circle(size = 15, fill_color = Spectral4[0])
graph_renderer.node_renderer.selection_glyph = Circle(size = 15, fill_color = 
 Spectral4[2])
graph_renderer.node_renderer.hover_glyph = Circle(size = 15, fill_color = 
 Spectral4[1])

# manipulating edges
graph_renderer.edge_renderer.glyph = MultiLine(line_color = '#CCCCCC', line_alpha = 
 .5, line_width = 5)
graph_renderer.edge_renderer.selection_glyph = MultiLine(line_color = Spectral4[2], 
 line_width = 5)
graph_renderer.edge_renderer.hover_glyph = MultiLine(line_color = Spectral4[1], 
 line_width = 5)

graph_renderer.selection_policy = NodesAndLinkedEdges()
graph_renderer.inspection_policy = EdgesAndLinkedNodes()

plot.renderers.append(graph_renderer)

output_notebook()
show(plot)

После запуска скрипта я получаю следующее:

screenshit Метка столбца группы отображается правильно, но не подтема. Буду признателен за любые идеи или указатели.

1 Ответ

0 голосов
/ 04 января 2019

Вы создаете ColumnDataSource, но затем фактически не используете его ни для чего. CDS не имеет никакого эффекта просто благодаря тому, что он был создан, его необходимо настроить для управления глифом или таблицей и т. Д. Инструмент для наведения курсора использует источник данных, настроенный глифом, который в этом случае устанавливается с помощью from_networkx , Вы можете получить доступ к источнику данных для средств визуализации узла, чтобы добавить к нему любые дополнительные столбцы (например, использовать для инструмента наведения):

graph_renderer.node_renderer.data_source.data['code1'] = # your data here
...