【问题标题】:Networkx Two Edges Instead of One to Show a LoopNetworkx 两条边而不是一条边以显示循环
【发布时间】:2023-04-04 07:37:01
【问题描述】:

在下面代码生成的图表中, B->DD->B

我希望这个“循环”用两条线表示(一条可能需要弯曲),而不是一条两端都有箭头的线。请问我该如何实现?

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'D'), ('C', 'G')])

pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, node_size = 500)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, arrows=True)
plt.show()

【问题讨论】:

    标签: python graph networkx


    【解决方案1】:

    你可以使用PyGraphviz

    >>> A = nx.nx_agraph.to_agraph(G)
    >>> A.draw("G.ps",prog='circo')
    

    【讨论】:

      【解决方案2】:

      您可以通过在nx.draw_edges 中指定连接样式来直接完成,虽然边缘不会在一条直线上:

      import networkx as nx
      import matplotlib.pyplot as plt
      
      plt.figure(1,figsize=(12,12)) 
      
      G = nx.MultiDiGraph()
      G.add_edges_from(
          [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
           ('B', 'H'), ('B', 'G'), ('B', 'D'), ('C', 'G')])
      
      pos = nx.spring_layout(G)
      nx.draw_networkx_nodes(G, pos, node_size = 500)
      nx.draw_networkx_labels(G, pos)
      nx.draw_networkx_edges(G, pos, connectionstyle='arc3, rad = 0.1', width = 2, arrows=True)
      plt.show()
      

      参考文献

      【讨论】:

        【解决方案3】:

        如果您不介意使用替代库 igraph 可以自动完成:

        import igraph as ig
        g = ig.Graph(directed=True)
        nodes = list('ABCDEFGH')
        edges = [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
             ('B', 'H'), ('B', 'G'), ('B', 'D'), ('C', 'G')]
        
        g.add_vertices(g_nodes)
        g.add_edges(g_edges)
        
        ig.plot(g,  
                bbox = (400, 200), # bounding box of plot
                vertex_color='lightblue',
                vertex_label=nodes,
                vertex_frame_width=3)
        

        但有一些可能很重要的区别:

        • 只有从0开始的连续整数才能作为顶点索引,所以需要手动添加映射:

           idx = dict(zip(nodes, range(len(nodes))))
           g_nodes = [idx[A] for A in nodes]
           g_edges = [(idx[A], idx[B]) for A, B in edges]
          
        • 它使用非常有限的内部表面而不是 matplotlib。请注意,您需要自己定义图表的大小。

        • 需要安装igraphpycairo

        【讨论】:

          猜你喜欢
          • 2012-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多