【问题标题】:Plot bokeh MultiLine using different width使用不同宽度绘制散景 MultiLine
【发布时间】:2019-07-02 11:27:07
【问题描述】:

我想将 MultiLine 与提供 LineWidth 的列表一起使用,以便图表中的每条边都以不同的宽度绘制。下面是从documentation 中提取的一个简化示例,它会引发错误。是否有可能使用不同宽度的 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)

【问题讨论】:

    标签: python bokeh multiline


    【解决方案1】:

    找到答案。对于那些偶然发现相同问题的人来说,这里有解决方案。您可以使用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)
    

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 2018-04-15
      • 2019-12-02
      • 2018-01-30
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2022-12-04
      相关资源
      最近更新 更多