【问题标题】:How to draw properly networkx graphs如何正确绘制networkx图
【发布时间】:2016-09-23 09:33:19
【问题描述】:

我得到了这段代码,它允许我绘制如下图所示的图表

import networkx as nx
import pylab as plt
from networkx.drawing.nx_agraph import graphviz_layout


G = nx.DiGraph()
G.add_node(1,level=1)
G.add_node(2,level=2)
G.add_node(3,level=2)
G.add_node(4,level=3)

G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,4)

nx.draw(G, pos=graphviz_layout(G), node_size=1600, cmap=plt.cm.Blues,
        node_color=range(len(G)),
        prog='dot')
plt.show()

问题是,我如何绘制带有节点的图形:

  • 使用白色背景色
  • 里面有标签
  • 有方向箭头
  • 可选的箭头显示一定的重量
  • 自动或手动安排得很好

类似于下图的东西

正如您在该图像中看到的那样,节点对齐得非常好

【问题讨论】:

    标签: python graph networkx


    【解决方案1】:

    由于您拥有 Graphviz,您可以使用它来制作精美的绘图并控制绘图的元素。 “点”布局引擎在定位有向图方面做得很好,就像你的例子中的那样。 例如

    import networkx as nx
    import pylab as plt
    from networkx.drawing.nx_agraph import graphviz_layout, to_agraph
    import pygraphviz as pgv
    
    G = nx.DiGraph()
    G.add_node("A",rank=0)
    G.add_nodes_from(['B','C','D'],style='filled',fillcolor='red')
    G.add_nodes_from(['D','F','G'])
    G.add_nodes_from(['H'],label='target')
    G.add_edge('A','B',arrowsize=2.0)
    G.add_edge('A','C',penwidth=2.0)
    G.add_edge('A','D')
    G.add_edges_from([('B','E'),('B','F')],color='blue')
    G.add_edges_from([('C','E'),('C','G')])
    G.add_edges_from([('D','F'),('D','G')])
    G.add_edges_from([('E','H'),('F','H'),('G','H')])
    
    # set defaults
    G.graph['graph']={'rankdir':'TD'}
    G.graph['node']={'shape':'circle'}
    G.graph['edges']={'arrowsize':'4.0'}
    
    A = to_agraph(G)
    print(A)
    A.layout('dot')
    A.draw('abcd.png')
    

    产生输出

    strict digraph {
        graph [rankdir=TD];
        node [label="\N",
            shape=circle
        ];
        A    [rank=0];
        C    [fillcolor=red,
            style=filled];
        A -> C   [penwidth=2.0];
        B    [fillcolor=red,
            style=filled];
        A -> B   [arrowsize=2.0];
        D    [fillcolor=red,
            style=filled];
        A -> D;
        C -> E;
        C -> G;
        B -> E   [color=blue];
        B -> F   [color=blue];
        D -> G;
        D -> F;
        H    [label=target];
        E -> H;
        G -> H;
        F -> H;
    }
    

    由点渲染为

    您可以在http://www.graphviz.org/doc/info/attrs.html阅读有关可调绘图参数的信息

    【讨论】:

    • 非常感谢,这真的很有帮助,+1 :)
    • 嗨!你知道如何将标签放在节点的两侧吗?我有这张图stackoverflow.com/questions/49368341/…,标签无法读取,因为它们被放置在节点上......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2013-10-13
    相关资源
    最近更新 更多