Обновление сетевого графика в боке - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь отобразить сетевой график с полем ввода, и при проверке ввода обновите sh график с данными, обновленными в соответствии с этим вводом. Однако я понял, что после обновления график будет пустым. Я пробовал использовать этот пример https://docs.bokeh.org/en/latest/docs/user_guide/server.html?highlight=event%20button#single -module-format Но кажется, что обновления источника данных недостаточно с графом. Вот мой код.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import networkx as nx

from bokeh.plotting import figure, from_networkx, curdoc
from bokeh.models import Rect, HoverTool,  TextInput
from bokeh.layouts import column

global graph
G = nx.Graph()

field = TextInput(value="first", title="Graph to select: ")

def graphe(base, H):
    for i in range(0,10):
        H.add_node(base+str(i), {'name':base+str(i),
                            'version': str(i),
                            'width': .2,
                            'offset':- 25,
                             'color': ' red'})
        H.add_edge(base +str(0), base+str(i))

def update(attr, old, new):
    newG = nx.Graph()
    graphe("second", newG)
    newgraph = from_networkx(newG, nx.spring_layout, scale=4, center=(0,0))
    graph.node_renderer.data_source.data = dict(newgraph.node_renderer.data_source.data)
    graph.edge_renderer.data_source.data = dict(newgraph.edge_renderer.data_source.data)
    graph.node_renderer.glyph = Rect(height=0.1, width="width", fill_color="color")

graphe("first", G)
plot = figure(title="RPM network", width= 1500, height= 800, x_range=(-2.1, 2.1), y_range=(-2.1, 2.1),
              tools="", toolbar_location=None)

hover = HoverTool()
hover.tooltips = """
<div style=padding=5px>@name</div>
<div style=padding=5px>@version</div>
"""
plot.add_tools(hover)
graph = from_networkx(G, nx.spring_layout, scale=4, center=(0,0))
graph.node_renderer.glyph = Rect(height=0.1, width="width", fill_color="color")
plot.renderers.append(graph)
field.on_change('value', update)

curdoc().add_root(column(field, plot))

Вместо обновления источника данных я попытался также построить новый граф с той же глобальной переменной graph, но в этом случае граф не обновляется. Что я пропустил?

1 Ответ

0 голосов
/ 17 июля 2020

Вот решение, которое работает. В процедуре обновления новый сюжет строится так же, как и первый. В конце элемент дочерних элементов макета заменяется новым графиком.

# -*- coding: utf-8 -*-

import networkx as nx

from bokeh.plotting import figure, from_networkx, curdoc
from bokeh.models import Rect, HoverTool,  TextInput
from bokeh.layouts import column

global graph
G = nx.Graph()

field = TextInput(value="first", title="Graph to select: ")

def graphe(base, H):
    for i in range(0,10):
        H.add_node(base+str(i), {'name':base+str(i),
                            'version': str(i),
                            'width': .2,
                            'offset':- 25,
                             'color': ' red'})
        H.add_edge(base +str(0), base+str(i))

def update(attr, old, new):
    newG = nx.Graph()
    graphe(new, newG)
    newplot = figure(title="RPM network", width= 1500, height= 800, x_range=(-2.1, 2.1), y_range=(-2.1, 2.1),
              tools="", toolbar_location=None)
    newgraph = from_networkx(newG, nx.spring_layout, scale=4, center=(0,0))
    newgraph.node_renderer.glyph = Rect(height=0.1, width="width", fill_color="color")
    newplot.add_tools(hover)
    newplot.renderers.append(newgraph)
    layout.children[1] = newplot

graphe("first", G)
plot = figure(title="RPM network", width= 1500, height= 800, x_range=(-2.1, 2.1), y_range=(-2.1, 2.1),
              tools="", toolbar_location=None)

hover = HoverTool()
hover.tooltips = """
<div style=padding=5px>@name</div>
<div style=padding=5px>@version</div>
"""
plot.add_tools(hover)
graph = from_networkx(G, nx.spring_layout, scale=4, center=(0,0))
graph.node_renderer.glyph = Rect(height=0.1, width="width", fill_color="color")
plot.renderers.append(graph)
field.on_change('value', update)

layout = column(field, plot)
curdoc().add_root(layout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...