Участок боке MultiLine разной ширины - PullRequest
0 голосов
/ 02 июля 2019

Я хотел бы использовать MultiLine со списком, который предоставляет LineWidth, чтобы каждый ребро на графике отображалось с различной шириной. Ниже приведен упрощенный пример, взятый из документации , которая выдает ошибку. Есть ли возможность использовать MultiLine с разной шириной? Или вы знаете другой способ построения графика с разной шириной?

    import networkx as nx

    from bokeh.io import show, output_file
    from bokeh.models import Plot, Range1d, MultiLine, Circle, HoverTool, TapTool, BoxSelectTool
    from bokeh.models.graphs import from_networkx
    from bokeh.palettes import Spectral4
    import numpy as np

    G=nx.karate_club_graph()
    ewidth = [np.random.random() for (u, v, d) in G.edges(data=True)]

    plot = Plot(plot_width=400, plot_height=400,
                x_range=Range1d(-1.1,1.1), y_range=Range1d(-1.1,1.1))
    plot.title.text = "Graph Interaction Demonstration"
    plot.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool())

    graph_renderer = from_networkx(G, nx.circular_layout, scale=1, center=(0,0))
    graph_renderer.node_renderer.glyph = Circle(size=15, fill_color=Spectral4[0])

    #this works:
    #graph_renderer.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8, line_width=5)

    # this doesnt work:
    graph_renderer.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8, line_width=ewidth)


    plot.renderers.append(graph_renderer)

output_file("interactive_graphs.html")
show(plot)

1 Ответ

1 голос
/ 02 июля 2019

Нашел ответ. Для тех, кто спотыкается об одном и том же вопросе, здесь решение. Вы можете сделать это либо с помощью set_edge_attributes, либо добавив свойство к источнику данных

graph_renderer.node_renderer.data_source.data['edge_width'] = ...

под кодом:

        import networkx as nx

        from bokeh.io import show
        from bokeh.models import Plot, Range1d, MultiLine, Circle, HoverTool, TapTool, BoxSelectTool
        from bokeh.models.graphs import from_networkx
        from bokeh.palettes import Spectral4
        import numpy as np

        G=nx.karate_club_graph()

        #option 1    
        edge_attrs={}
        for  (u, v, d) in G.edges(data=True):
            edge_attrs[(u, v)] = np.round(np.random.random() ,2)
        nx.set_edge_attributes(G, edge_attrs, "edge_width")
        ###

        plot = Plot(plot_width=400, plot_height=400,
                    x_range=Range1d(-1.1,1.1), y_range=Range1d(-1.1,1.1))
        plot.title.text = "Graph Interaction Demonstration"
        plot.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool())

        graph_renderer = from_networkx(G, nx.circular_layout, scale=1, center=(0,0))
        # option 2    
        #graph_renderer.node_renderer.data_source.data['edge_width']=[np.random.random() for (u, v, d) in G.edges(data=True)]
        ###
        graph_renderer.node_renderer.glyph = Circle(size=15, fill_color=Spectral4[0])
        graph_renderer.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8, line_width="edge_width")

        plot.renderers.append(graph_renderer)

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