2012-04-30 3 views
14

나는 파이썬을 사용하여 유향 그래프에서 발생하는 프로세스를 시뮬레이션합니다. 이 과정의 애니메이션을 제작하고 싶습니다.모든 가장자리를 개별적으로 보여주는 방식으로 파이썬에서 유향 그래프를 그려야합니다.

제가 직면 한 문제는 대부분의 파이썬 그래프 시각화 라이브러리가 한 쌍의 방향성 가장자리를 단일 가장자리로 결합한다는 것입니다.

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.MultiDiGraph() 

G.add_edges_from([ 
    (1, 2), 
    (2, 3), 
    (3, 2), 
    (2, 1), 
]) 

plt.figure(figsize=(8,8)) 
nx.draw(G) 

Output from NetworkX; parallel edges are overlapping, so only two lines are displayed

나는 이런 식으로 뭔가를 표시하려는 각각 : I 별도로 네 모서리의 각을 표시하고자하는 반면, 다음과 같은 그래프를 표시 할 때 예를 들어, NetworkX는 두 가장자리를 그립니다 병렬 가장자리는 별도로 그려 :

Desired output format; parallel edges are drawn separately

질문 R reciprocal edges in igraph in R이 같은 문제점을 해결하기위한 것으로 보인다,하지만 해결책이 Python 코드 라이브러리가 아니라 R igraph 라이브러리 용입니다.

기존 파이썬 그래프 시각화 라이브러리를 사용하여이 스타일의 플롯을 쉽게 만들 수 있습니까? 멀티 그래프를 지원할 수 있다면 보너스가 될 것입니다.

이미지를 생성하기 위해 외부 프로그램을 호출하는 솔루션에 대해 열려 있습니다. 일련의 전체 애니메이션 프레임을 생성하고 싶기 때문에 솔루션을 자동화해야합니다.

+0

관련 http://stackoverflow.com/questions/15053686/networkx-overlappin g-edges-visualizing-multigraph –

답변

15

Graphviz 도구는 뚜렷한 가장자리를 표시합니다. dot

digraph G { 
    A -> B; 
    A -> B; 
    A -> B; 
    B -> C; 

    B -> A; 
    C -> B; 
} 

가 생성 : "파이썬을 찾고 있지만

example graph

graphviz를의 입력 언어, 그래서 당신은 당신의 자신에 그것을 생성 할 수 있습니다 매우 간단하다이주는 예를 들어

, graphviz "는 두 개의 라이브러리를 보여줍니다. NetworkX, 파일 I/O를 방지하고 레이아웃 pydot를 통해 점을 사용 가능한 해결 방법을 사용

+2

NetworkX는 [pydot를 사용하여 .dot 파일 내보내기] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pydot) 또는 [pygraphviz] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_agraph)이므로 완벽하게 작동합니다. 감사! –

9

은 다음과 같습니다 seek(0)이 필요한 이유에 대한

import networkx as nx 
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
from cStringIO import StringIO 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) # d is a pydot graph object, dot options can be easily set 
# attributes get converted from networkx, 
# use set methods to control dot attributes after creation 

png_str = d.create_png() 
sio = StringIO() # file-like string, appropriate for imread below 
sio.write(png_str) 
sio.seek(0) 

img = mpimg.imread(sio) 
imgplot = plt.imshow(img) 

How to create an image from a string in python를 참조하면 IPython 내 (QT) 콘솔을 사용하면 위의 내용이 인라인으로 인쇄되고 더 직접적인 접근 방식이 사용됩니다.

import networkx as nx 
from IPython.display import Image 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) 

png_str = d.create_png() 
Image(data=png_str) 
+0

이 예제는 업데이트해야합니다 :'nx.to_pydot'는 더 이상 사용할 수 없습니다. 대신에'pip install pydotplus'를 실행하고 대신'nx.drawing.nx_pydot.to_pydot'를 사용하십시오. – ogrisel

+1

이 예제를 업데이트해야 할 필요성을 제기 해 주셔서 감사합니다. 'pydotplus'는 이미 업스트림'networkx'에서'pydot'으로 되돌려졌습니다. [this PR] (https://github.com/networkx/networkx/pull/2272)를 참조하십시오. –

+0

pydotplus가'graphviz' 프로그램을 찾지 못하면'InvocationException : GraphViz의 실행 파일을 찾을 수 없습니다 .'라는 메시지가 나옵니다. 해결 방법은 현재 실행을 위해 시스템 경로에 추가하는 것입니다 :'import os' 다음에'os.environ [ "PATH"] + r "C : \ Anaconda \ envs \ testes \ Library \ bin \ graphviz" 여기서 graphviz 실행 파일이있는 폴더를 대체해야합니다. – mvbentes