【问题标题】:Networkx: Overlapping edges when visualizing MultiGraphNetworkx:在可视化 MultiGraph 时重叠边
【发布时间】:2013-02-24 16:14:14
【问题描述】:

以下多重图正确绘制(即平行边不重叠)使用graphvizneato生成png(如this answer所示)

import networkx as nx
nx.MultiGraph ([(1,2),(1,2),(1,2),(3,1),(3,2)])
nx.write_dot(Gm,'multi.dot')
!neato -T png multi.dot > multi.png

但是使用 Networkx 的绘图功能并不能解决问题

nx.draw_graphviz(Gm,prog='neato')

是否可以使用 Networkx 的绘制方法来防止重叠边缘?

谢谢

【问题讨论】:

    标签: python python-2.7 matplotlib graphviz networkx


    【解决方案1】:

    很遗憾没有。这在技术上是可行的,但到目前为止还没有人编写代码。

    【讨论】:

    【解决方案2】:

    您可以使用您计算的节点位置直接使用 matplotlib。

    G=nx.MultiGraph ([(1,2),(1,2),(1,2),(3,1),(3,2)])
    pos = nx.random_layout(G)
    nx.draw_networkx_nodes(G, pos, node_color = 'r', node_size = 100, alpha = 1)
    ax = plt.gca()
    for e in G.edges:
        ax.annotate("",
                    xy=pos[e[0]], xycoords='data',
                    xytext=pos[e[1]], textcoords='data',
                    arrowprops=dict(arrowstyle="->", color="0.5",
                                    shrinkA=5, shrinkB=5,
                                    patchA=None, patchB=None,
                                    connectionstyle="arc3,rad=rrr".replace('rrr',str(0.3*e[2])
                                    ),
                                    ),
                    )
    plt.axis('off')
    plt.show()
    

    【讨论】:

      【解决方案3】:

      好吧,我知道它可能不是您要找的东西,但是我遇到了类似的问题,我希望有一个有向图,其中两个节点之间的边根据方向具有不同的权重(无论是进入或离开节点)并且我所做的工作是我为每个边缘使用了不同的颜色并降低了其中一个的不透明度,因此即使它们重叠也会显示出来。 我只需要两个节点之间的两条边,所以它对我有用。

      G = nx.DiGraph()
      G.add_nodes_from([0,1])
      pos = nx.circular_layout(G)
      nx.draw_networkx_nodes(G, pos, node_color = 'r', node_size = 100, alpha = 1)
      nx.draw_networkx_edges(G, pos, edgelist = [(0,1)], width = 2, alpha = 0.5, edge_color='b')
      nx.draw_networkx_edges(G, pos, edgelist= [(1,0)], width = 1, alpha = 1)
      plt.axis('off')
      plt.show() 
      

      【讨论】:

        【解决方案4】:

        对上述答案的改进是将connectionstyle 参数添加到 nx.draw:

        import networkx as nx
        G = nx.DiGraph()
        G.add_nodes_from([0,1])
        pos = nx.circular_layout(G)
        nx.draw_networkx_nodes(G, pos, connectionstyle='arc3, rad = 0.1', node_color = 'r', node_size = 100, alpha = 1)
        nx.draw_networkx_edges(G, pos,connectionstyle='arc3, rad = 0.1', edgelist = [(0,1)], width = 2, alpha = 0.5, edge_color='b')
        nx.draw_networkx_edges(G, pos,connectionstyle='arc3, rad = 0.1', edgelist= [(1,0)], width = 1, alpha = 1)
        plt.axis('off')
        plt.show() 
        

        【讨论】:

        • 有一个小错误,draw_networkx_nodes 没有(或不再)接受参数connectionstyle。干杯:-)
        猜你喜欢
        • 1970-01-01
        • 2015-12-30
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 1970-01-01
        相关资源
        最近更新 更多