NetworkX에서 계층 적 출력을 보장하는 방법이 있습니까?


84

트리 구조 의 흐름도를 생성하려고합니다 . networkx로 대표 그래프를 만들 수 있었지만 플롯을 출력 할 때 트리 구조 를 표시 할 방법이 필요합니다 . 그래프를 그리기 위해 matplotlib.pylab을 사용하고 있습니다.

여기 에 표시된 것과 유사한 구조로 데이터를 표시해야합니다 . 하위 그래프는 없지만.

그런 구조를 어떻게 보장 할 수 있습니까?

불신자를위한 예 :

다양한 NetworkX 레이아웃

pylab 및 graphviz를 사용하여 그래프를 표시 할 수 있었지만 어느 쪽도 내가 찾고있는 트리 구조를 제공하지 않습니다. networkx가 제공해야하는 모든 레이아웃을 시도했지만 계층 구조를 표시하는 것은 없습니다 . 어떤 옵션 / 모드 를 제공 해야하는지 또는 가중치를 사용 해야하는지 잘 모르겠습니다 . 어떤 제안이라도 도움이 될 것입니다.

@jterrace :

다음은 위의 플롯을 생성하는 데 사용한 대략적인 개요입니다. 몇 가지 레이블을 추가했지만 그 외에는 동일합니다.

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

G.add_node("ROOT")

for i in xrange(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)

plt.title("draw_networkx")
nx.draw_networkx(G)

plt.show()

답변:


116

유 방향 그래프를 사용하는 경우 Graphviz 도트 레이아웃은 트리에서 원하는 작업을 수행합니다. 다음은이를 수행하는 방법을 보여주는 위의 솔루션과 유사한 코드입니다.

import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout
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.nx_agraph.write_dot(G,'test.dot')

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

Graphviz 출력

NetworkX / Matplotlib 출력

업데이트 됨

다음은 networkx-2.0 용으로 업데이트 된 버전입니다 (그리고 향후 networkx-2.1도 화살표를 그립니다).

import networkx as nx
from networkx.drawing.nx_agraph import write_dot, graphviz_layout
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"
write_dot(G,'test.dot')

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

여기에 이미지 설명 입력


1
아하! 그래서 제가 필요한 것은 '점'레이아웃이있는 방향성 그래프뿐이었습니다. 나는 그것이 아주 작은 것임을 알았습니다. 고마워요 Aric!
최대

노드에 오름차순으로 레이블을 지정하는 좋은 방법이 있습니까? 내 말 것을, 나는 그래프를 만들 g = nx.full_rary_tree(2, 10)내가 얻을 가장자리를 인쇄 할 경우 : [(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), ... ]하지만 ... 다른 순서로 시각화합니다
CodeKingPlusPlus

1
PyGrapviz 파이썬 3로 작동하고이 코드를 파이썬 3로 작동합니다
Aric

3
또한 pygraphviz정기적으로 설치하는 데 문제가있는 경우 다음을 시도해보십시오pip install --install-option="--include-path=/usr/local/include/" --install-option="--library-path=/usr/local/lib/" pygraphviz
Rotail

2
@Rotail 이것은 내가 설치 한 후에 나를 위해 일했습니다 graphviz(내 경우에는 brew install graphviz).
Shivendra

10

pygraphviz를 사용하여 가까이 다가 갈 수 있습니다.

>>> import pygraphviz
>>> import networkx
>>> import networkx as nx
>>> G = nx.Graph()
>>> G.add_node("ROOT")
>>> for i in xrange(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)

>>> A = nx.to_agraph(G)
>>> A.layout('dot', args='-Nfontsize=10 -Nwidth=".2" -Nheight=".2" -Nmargin=0 -Gfontsize=8')
>>> A.draw('test.png')

결과: 여기에 이미지 설명 입력

참고 위에 게시 한 링크에서 graphviz 옵션을 복사했습니다. 4 번째 자식이 엄격하게 수직 형식이 아닌 위에 그려지는 이유를 잘 모르겠습니다. Graphviz 옵션에 대해 더 많이 아는 사람이 도움을 줄 수 있습니다.


감사. 이것은 내가 그것을 시도했을 때 본 것과 정확히 일치했습니다. 나는 그것이 왜 이와 같은 것을 생산했는지가 다소 이상하다는 것을 알았습니다.
최대

5
networkx 버전 1.11에서 api가 변경되었습니다. 이 to_agraph함수는 이제에 있습니다 nx.nx_agraph.to_agraph.
m00am

1
자녀가 항상 부모 아래에 있도록하는 방법이 있습니까?
Dror

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.