【问题标题】:networkx - change color/width according to edge attributes - inconsistent resultnetworkx - 根据边缘属性更改颜色/宽度 - 结果不一致
【发布时间】:2014-10-27 15:36:10
【问题描述】:

我设法正确地生成了图表,但经过更多测试发现以下两行不同代码的结果不一致:

colors = [h.edge[i][j]['color'] for (i,j) in h.edges_iter()]
widths = [h.edge[i][j]['width'] for (i,j) in h.edges_iter()]
nx.draw_circular(h, edge_color=colors, width=widths)

这种方法会产生一致的输出,而以下方法会根据边缘的顺序产生错误的颜色/大小:

colors = list(nx.get_edge_attributes(h,'color').values())
widths = list(nx.get_edge_attributes(h,'width').values())
nx.draw_circular(h, edge_color=colors, width=widths)

但是,在我看来,以上两行都依赖于函数调用来按边的顺序返回属性。为什么会有不同的结果?

h[][][] 访问属性对我来说有点笨拙;是否可以通过点约定访问它,例如edge.color for edge in h.edges().

还是我错过了什么?

【问题讨论】:

    标签: python python-3.x networkx


    【解决方案1】:

    如果您想避免手动添加边缘颜色和 alphas / 宽度,您可能还会发现此功能很有帮助:

    def rgb_to_hex(rgb):
        return '#%02x%02x%02x' % rgb
    
    adjacency_matrix = np.array([[0, 0, 0.5], [1, 0, 1], [1, 0.5, 0]]))
    n_graphs = 5
    fig, axs = plt.subplots(1, len(n_graphs), figsize=(19,2.5)) 
    
    for graph in range(n_graphs):   
    
        pos = {0: (1, 0.9), 1: (0.9, 1), 2: (1.1, 1)} 
    
        # draw DAG graph from adjacency matrix 
        gr = nx.from_numpy_matrix(adjacency_matrix, create_using=nx.DiGraph)
        weights = nx.get_edge_attributes(gr, "weight")
      
        # adding nodes 
        all_rows = range(0, adjacency_matrix.shape[0])
        for n in all_rows:
            gr.add_node(n)
        
        # getting edges 
        edges = gr.edges()
          
        # weight and color of edges 
        scaling_factor = 4 # to emphasise differences 
        alphas = [weights[edge] * scaling_factor for edge in edges]
        colors = [rgb_to_hex(tuple(np.repeat(int(255 * (1- 
        weights[edge])),3))) for edge in edges]
        
        # draw graph 
        nx.draw(gr, 
                pos, 
                ax=axs[graph],
                edgecolors='black', 
                node_color='white', 
                node_size=2000, 
                labels={0: "A", 1: "B", 2: "C"},
                font_weight='bold',
                linewidths=2,
                with_labels=True,
                connectionstyle="arc3,rad=0.15",
                edge_color=colors,
                width=alphas)
    
      
    plt.tight_layout()
    

    【讨论】:

    • 这允许您从邻接矩阵中的权重中获取边缘属性,然后根据属性创建边缘权重/alphas 和颜色
    【解决方案2】:

    字典是用于 NetworkX 图的底层数据结构,从 Python 3.7+ 开始,它们是 maintain insertion order。 这意味着我们可以安全地使用nx.get_edge_attributes 来检索边缘属性,因为我们保证在每次运行Graph.edges()(内部由get_edge_attributes 调用)中具有相同的边缘顺序。

    所以在绘图的时候,我们可以直接从get_edge_attributes返回的结果中设置edge_colorwidth等属性。这是一个例子:

    G = nx.Graph()
    G.add_edge(0,1,color='r',weight=2)
    G.add_edge(1,2,color='g',weight=4)
    G.add_edge(2,3,color='b',weight=6)
    G.add_edge(3,4,color='y',weight=3)
    G.add_edge(4,0,color='m',weight=1)
    
    colors = nx.get_edge_attributes(G,'color').values()
    weights = nx.get_edge_attributes(G,'weight').values()
    
    pos = nx.circular_layout(G)
    nx.draw(G, pos, 
            edge_color=colors, 
            width=list(weights),
            with_labels=True,
            node_color='lightgreen')
    

    【讨论】:

    • 我需要更改重量类型以使其工作weights = list(nx.get_edge_attributes(G,'weight').values())
    • 是的,请注意,在nx.draw@tobias 中绘图时,我确实从中构建了一个列表
    【解决方案3】:

    传递给绘图函数的边的顺序很重要。如果您不指定(使用 edges 关键字),您将获得 G.edges() 的默认顺序。像这样显式地给出参数是最安全的:

    import networkx as nx
    
    G = nx.Graph()
    G.add_edge(1,2,color='r',weight=2)
    G.add_edge(2,3,color='b',weight=4)
    G.add_edge(3,4,color='g',weight=6)
    
    pos = nx.circular_layout(G)
    
    edges = G.edges()
    colors = [G[u][v]['color'] for u,v in edges]
    weights = [G[u][v]['weight'] for u,v in edges]
    
    nx.draw(G, pos, edges=edges, edge_color=colors, width=weights)
    

    这会产生如下输出:

    【讨论】:

    • 获取ValueError: Received invalid argument(s): edges - 运行python3
    • @SCBuergel 可以省略edges参数
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多