使用networkX输出树结构

时间:2018-01-22 11:28:04

标签: python networkx graphviz pygraphviz

我使用networkX生成树结构如下(我跟随answer of this question)。

import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()

G.add_node("ROOT")
for i in range(5):
    G.add_node("Child_%i" % i)
    G.add_node("Grandchild_%i" % i)
    G.add_node("Greatgrandchild_%i" % i)

    G.add_edge("ROOT", "Child_%i" % i)
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)

# write dot file to use with graphviz
# run "dot -Tpng test.dot >test.png"
nx.write_dot(G,'test.dot')

# same layout using matplotlib with no labels
plt.title('draw_networkx')
pos=nx.graphviz_layout(G, prog='dot')
nx.draw(G, pos, with_labels=False, arrows=False)
plt.savefig('nx_test.png')

我想画一棵树,如下图所示。 enter image description here

但是,我收到错误AttributeError: module 'networkx' has no attribute 'write_dot'。我的networkx版本是1.11(使用conda)。我尝试了不同的hacks,但没有一个工作。

所以,我有兴趣知道是否有另一种使用networkx绘制树结构的方法来获得类似于图中提到的输出。请告诉我。

2 个答案:

答案 0 :(得分:1)

我认为这个问题已在networkx 2.x上解决,但在此之前你应该明确导入这样的函数。

from networkx.drawing.nx_agraph import write_dot

from networkx.drawing.nx_pydot import write_dot

我希望这有效。

答案 1 :(得分:1)

您可以使用pygraphviz完全绘制有向图。

首先需要执行以下步骤,因为pygraphviz在没有graphviz的情况下无效(截至目前)。

  1. http://www.graphviz.org/Download_windows.php下载graphviz-2.38.msi并安装
  2. http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygraphviz
  3. 下载2.7或3.4 pygraphviz轮文件
  4. 导航到您下载了滚轮文件的目录并运行特定于平台的滚轮 pip install pygraphviz‑1.3.1‑cp34‑none‑win32.whl
  5. dot.exe添加到主机路径 例如在Windows控制面板 - >系统 - >编辑环境变量 - >修改路径
  6. 之后可以创建dotpng文件,如下所示。

    工作代码

    import pygraphviz as pgv
    
    G=pgv.AGraph(directed=True)
    
    #Attributes can be added when adding nodes or edge
    G.add_node("ROOT", color='red')
    for i in range(5):
        G.add_node("Child_%i" % i, color='blue')
        G.add_node("Grandchild_%i" % i, color='blue')
        G.add_node("Greatgrandchild_%i" % i, color='blue')
    
        G.add_edge("ROOT", "Child_%i" % i, color='blue')
        G.add_edge("Child_%i" % i, "Grandchild_%i" % i, color='blue')
        G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i, color='blue')
    
    # write to a dot file
    G.write('test.dot')
    
    #create a png file
    G.layout(prog='dot') # use dot
    G.draw('file.png')
    

    PNG文件
    enter image description here