python - 如何正确绘制 networkx 图

标签 python graph networkx

我得到了这段代码,可以让我绘制如下图所示的图表

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()

enter image description here

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

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

类似下图的内容

enter image description here

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

最佳答案

由于您拥有 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;
}

由点渲染为

enter image description here

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

关于python - 如何正确绘制 networkx 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39657395/

相关文章:

python - 加速 Python 脚本的 for 循环

graph - 当我们删除 JanusGraph 中的节点后,节点边会发生什么?

python - 如何在networkx中手工实现DFS

python - 获取networkx中匹配节点的列表

python - 保存 networkx 有向图,保留节点属性

python - 如何在一定范围内创建随机数组

Python自定义排序

python - 使用 Selenium 启动 Chromedriver

algorithm - 我们可以将 Bellman-Ford 算法应用于无向图吗?

java - 创建具有太多顶点的图