REP - NETWORKX - 019, JULY 2010 1 NetworkX 를이용한 Python 그래프가시화 Graph Visualization from Python Using NetworkX 김선영 Kim SeonYeong 부산대학교컴퓨터공학과 s.y.kim@pusan.ac.kr ABSTRACT Python 은사용하기쉬운오픈소스프로그래밍언어로, 그사용자가늘어나고있는추세이다. 그러나아직까지자료구조용그래프를설계해서시각화하기위한도구들이부족한실정으로, Windows OS 기반에서 Python 으로그래프를그릴수있는무료라이브러리와모듈에대한조사가필요하다. 현재그래프가시화소프트웨어로많이알려진 Graphviz 를 Python 에서내장하여사용하려는라이브러리들과모듈들은 Windows OS 기반에서제대로동작하지않으므로사용할수없다. 이로인해 Windows 사용자들은 Graphviz 내장이필수가아닌 Python Package 인 NetworkX 를가장일반적으로사용하고있다. 따라서본보고서에서는현재 Windows 운영체제와호환되는 Python Package 인 NetworkX 의설치방법과그사용예제에대해서알아본다. KEYWORDS Python Graph Drawing Tool, NetworkX 1 서론 Python은사용하기쉬운오픈소스프로그래밍언어로 [1], 프로토타입작성이쉽고교육용으로적합한언어이다. 그러나아직까지 Python으로자료구조를학습하기위한그래프설계및시각화도구들은충분하지못하므로, Windows OS 기반에서 Python으로그래프를그릴수있는무료라이브러리와모듈에대한조사가필요하다. 현재그래프가시화소프트웨어로많이알려진 Graphviz를 Python에서내장하여사용하려는라이브러리들과모듈들은 Windows OS 기반에서제대로동작하지않으므로사용할수없다. 이로인해 Windows 사용자들은 Graphviz 내장이필수가아닌 Python Package인 NetworkX를가장일반적으로사용하고있다. 따라서본보고서에서는현재 Windows 운영체제와호환되는 Python Package인 NetworkX의설치방법과그사용예제에대해서알아보고자한다 2 관련연구 Python으로그래프를그리기위해서여러가지무료도구들을사용할수있다. 대표적인패키지들이 PyGraphviz, Pydot, igraph, NetworkX 등이다. 그러나이들대부분은 Linux와 OSX 계열에호환되어있고 Windows 계열도지원하지만, Winodws OS의경우많은버그를가지고있기때문에현재 Windows 운영체제와정상적으로호환되는패키지는 NetworkX 이다. 각패키지의종류와각각에대한자세한내용은다음과같다.
REP - NETWORKX - 019, JULY 2010 2 1. PyGraphviz : http://networkz.lanl.gov/pygraphviz/ PyGraphviz 는 Graphviz 그래프레이아웃의 Python 용인터페이스로, PyGraphviz 로 Graphviz 그래프자료구조와레이아웃알고리즘에 Python으로접근하여그래프를생성하고편집할수있다 [2]. PyGraphviz를사용할수있는플랫폼은 Winodows, OSX, Linux이고, Windows 플랫폼에서안정화된버전은 0.99.1 버전인데, Windows에서정상적으로동작하지않는다. 2. Pydot : http://code.google.com/p/pydot/ Pydot은 Graphviz Dot 언어의 Python용인터페이스이다. Pydot은 Python으로방향을가지는그래프와방향없는그래프모두쉽게생성이가능하며, Dot 언어의모든속성을지원한다 [3]. Pydot은 Windows, OSX, Linux와호환된다고명시하고있다. 그러나현재의 Pydot 1.0.2 버전은그래프를생성하는주요함수들에버그가많고, 공식적인업그레이드가이루어지지않고있으며, 비공식패치로는여러 side-effect가수반되고있어 Windows 운영체제에서는사용하기가어렵다. 3. igraph : http://igraph.sourceforge.net/screenshots.html igraph는 Pydot과마찬가지로방향을가지는그래프와방향이없는그래프를생성하기위한무료소프트웨어패키지이다. igraph는 minumum spanning trees와같은전형적인그리프이론도포함하고, 커뮤니티구조검색과같은몇가지최신네트워크분석방법을구현하는알고리즘도포함하고있다 [4]. 그림 1 은 igraph를이용했을때생성할수있는다양한그래프레이아웃의모습이다. 호환되는운영체제로는 Windows, OSX, Linux가있으며 Python외에도 R package, Ruby, C 라이브러리등여러언어를지원한다. igraph는그래프알고리즘만을제공하므로그래프를시각화하여보기위해서는 Cairo 라이브러리와 Python을연동하는 pycairo 라이브러리가필요하다. 그러나시스템이 Cairo DLL들을찾지못하기때문에, Windows에서 pycairo 라이브러리를사용하려면추가적인개발도구세트가필요하다. 지금까지는 Visual Studio 2003 버전을사용해서개발을할경우, 구 pycairo 버전을설치하면잘동작한다는것만알려져있다. 추후 pycairo 버전이개선되어시스템이 Cairo DLL들을잘찾도록업데이트된다면 NetowrkX 보다더다양한그래프레이아웃을제공할수있으므로 igraph를사용하는것이 Python으로그래프를시각화하기에가장적합하다고할수있을것이다. 4. NetworkX : http://networkx.lanl.gov/gallery.html NetworkX는복잡한네트워크의기능과구조연구, 계산, 생성에관한 Python기반 Package이다 [5]. 그림 2 는 NetworkX를이용한다양한그래프레이아웃의모습이다. NetworkX는 Linux, OSX, Windows 운영체제와호환되며무료소프트웨어로써사용하기쉽기때문에, Python으로그래프알고리즘을사용하는사용자들에게많이알려져있다. igraph와같이 visualization 부분을포함하고있지않기때문에 matplotlib 라이브러리를사용하여 viewing 기능을제공한다. pygraphviz를내장하여그래프레이아웃을 Graphviz와같이다양한옵션을통해제공하고
REP - NETWORKX - 019, JULY 2010 3 (a) Fruchterman-Reingold Force based Layout (b) Kautz Graph with Adjacency Matrix (c) Erdős-Rényi Random Graph (d) Dendrogram (e) Fruchterman-Reingold Graph (f) Kamada-Kawai Algorithm 그림 1. igraph를이용한여러가지그래프레이아웃. NetworkX에 R package를내장하면 (d) Dendrogram, (e)fruchterman-reingold Graph 등보다더다양한그래프레이아웃을사용할수있다. 자하였으나, 앞서소개하였던이유와마찬가지로 pygraphviz를사용할수없기때문에그래프레이아웃에있어서는제한적이다. 그러나정상적으로잘동작하고버그도지속적으로수정되는등업데이트가잘이루어지므로현재 Python으로그래프를그리기에는가장적합한패키지가 NetworkX라고할수있다. 3 NetworkX 의기능소개및사용예 3.1 NetworkX 의특징 NetworkX는복잡한네트워크의기능, 구조와역학의생성, 계산과연구를위한 Python package로, 주요특징은다음과같다. 1. 표준그래프이론과통계물리학기능 2. applications, disciplines, platforms 사이에서네트워크알고리즘의쉬운변경
REP - NETWORK X - 019, JULY 2010 4 (a) 이항확률그래프에서의 컴포넌트 연결 출현 일러스트레이트 (b) Circular Tree (c) Random Geometric Graph (e) Grid (f) miles graph (d) Atlas of all graphs of 6 nodes or less 그림 2. NetworkX 를 이용한 다양한 그래프 레이아웃 3. 많은 전형적인 그래프와 합성 네트워크 지원 4. 시계열, 텍스트, 이미지나 XML 레코드와 같은 형태로 Nodes 와 Edges 가 변할 수 있음 5. C, C++, Fortran 등의 고품질 소프트웨어의 기존 코드를 잘 활용함 6. Open source 임 3.2 NetworkX 의 설치 Networkx 는 Python 2.4, 2.5, 2.6 버전과 호환되고 Windows 운영 체제에서의 설치 방법은 다음과 같다. 1. Python 2.6 버전을 설치한다. Python 2.4, 2.5 버전도 NetworkX 에서 잘 동작하나 이후 그래프 알고리즘을 시각화하는 모듈이 이 버전을 지원하지 않는다. 적합하지 않은 버전을 설치하면 예 제가 실행되지 않는다.
REP - NETWORKX - 019, JULY 2010 5 2. NetworkX 파일을받아설치한다. 콘솔창에서 Python networkx install 를입력하여완료할수있다. easy install을먼저설치했을경우, 콘솔창에서 networkx install 을입력함으로써간단하게설치할수도있다. 3. Networkx는그래프알고리즘을조작하고생성하는도구로, 이자체로는그래프를가시화하여확인할수없다. 따라서시각화패키지인 Matplotlib를추가로설치하여그래프를볼수있도록한다. Matplotlib는몇가지라이브러리들을필요로하므로이를함께설치한다. (a) Numpy 라이브러리설치 (b) Matplotlib 라이브러리설치 (c) pytz 설치 (d) Agg 설치 (e) dateutil 설치 4. 지금까지설치한 NetworkX 패키지가잘설치되었는지확인하기위해서 Testing 프로그램인 nose 를설치한다. 그리고 Python IDLE 에서 import networkx; networkx.test() 코드를수행함으로써설치를마무리한다. 3.3 NetworkX 의사용예제 NetworkX 를이용한간단한그래프예제를세가지살펴본다. 먼저단순한 node 와 edge 를생성하는 코드는그림 3 과같다. 그림 3. Node 6 개와 Edge 6 개로구성한간단한그래프 1. add edge : NetworkX 는여러가지함수를통해 node 와 edge 를생성할수있는데, 가장많이
REP - NETWORKX - 019, JULY 2010 6 사용하는함수가 add edge 함수이다. 이를통해 edge를생성하고 node를간접적으로생성할수있다. 2. draw network labels : node에레이블을단다. 3. draw network edge lables : edge에레이블을다는함수이다. 4. draw networkx nodes : 그래프에 node를추가하는함수로, node의타입이나색상등의속성을지정할수있다. 5. draw netwrkx edges : 그래프에 edge를추가하는함수로, edge의타입이나색상등의속성을지정할수있다. 그림 3 의실행결과는다음그림 4 과같다. node의색상은붉은색이고각각레이블이달려있으며, edge는실선, 점선, dotted로나누어지고그두께또한지정한바와같이나타났음을확인할수있다. 그림 4. 그림 3 의실행결과. Node 6개와 Edge 6개가생성된것을확인할수있다. 그림 4은 node와 edge의위치가정해져있는레이아웃을사용하지않기때문에몇가지레이아웃을사용하여그래프형태를바꿀수있다. NetworkX에서기본적으로제공하는그래프레이아웃의종류는 5가지로, shell, random, circular, spectral, spring 레이아웃이그것들이다. 그림 4 의그래프는 shell layout을적용한그래프이다. 그외의기본레이아웃을적용한그래프는그림 5와같다. NetworkX 에서제공하는기본그래프레이아웃외에 R package 등을설치하여 Fruchterman-Reingold Layout 등의더많은그래프레이아웃을사용할수도있다. 예제 1 에서는 node 의위치를사용자가일일이지정하지않아도레이아웃을통해적절히배치되 었다. 예제 2 에서는각 node 의위치를사용자가지정할수있다. 자세한코드는아래그림 6 과같다.
REP - NETWORKX - 019, JULY 2010 7 (a) Random Layout (b) Spring Layout (c) Spectral Layout (d) Circular Layout 그림 5. NetworkX 에서기본적으로제공하는레이아웃을적용한그래프. Shell Layout 을적용한그래프는그림 4와같다. 다음그림 7 은그림 6 를실행한결과이다. 각 node가지정한좌표값대로배열되었음을확인할수있다. 마지막으로방향성그래프예제에대해서살펴보겠다. NetworkX 에서는화살표가꺽은모양이아니라굵은선으로표시한다. 그래고방향성그래프를그리기위해서는지금까지의예제처럼 Graph 를만드는것이아니라 DiGraph를생성하여방향성그래프를그리기위한초석을만들어두어야한다. DiGraph로그래프형태를지정하였다하더라도추후 to undirected 함수를통해방향이없는그래프를생성할수도있다. 1. add path : Graph에서는 add edge 였으나, DiGraph에서방향성있는 edge를생성하기위해서는이함수를사용해야한다. 첫번째인자에서두번째인자방향으로화살표가생성된다. 그림 9 은그림 8 을실행한결과이다. 각 node를잇는 edge 중파란색굵은선이화살표를나타낸다. 2와 4 node의경우 2에서 4 방향으로화살표가생성되어, 제수가나눌수있는피제수를바르게선택했음을확인할수있다. NetworkX로그래프를그리고자할때 node와 edge를식별할수있는범위가어떻게되는지확인해보기위해서그림 8의노드를 10, 30, 50, 100, 500, 1000개로늘려그래프를생성하였다. 결과는
REP - NETWORKX - 019, JULY 2010 8 그림 6. node 위치지정해서그리기 그림 7. 그림 6 를실행한결과. house graph 로 node 가지정한위치에배치되었음을 확인할수있다. 그림 10 과같다. 그림 10를통해 node가 100개를초과하면사실상그래프를식별하기가불가능하다고볼수있다. 따라서 NetowkrX로그래프를생성할때사용가능한 node의수는 50개를초과하지않는것이바람직하다고여겨진다. 4 결론 본보고서에서는 Python 으로자료구조그래프를그리는무료패키지, 라이브러리와모듈에대해서 조사하고그중현재사용하기가장적합한 NetworkX 에대해서그기능과설치방법, 예제를살펴 보았다. 여러가지라이브러리와패키지가존재하나 Windows 운영체제와호환가능한라이브러리는
REP - NETWORKX - 019, JULY 2010 9 그림 8. 1 부터 10 까지의숫자중, 피제수가제수로나누어질경우제수에서피제수 방향으로화살표를생성한다. 그림 9. 그림 8 를실행한결과. 제수가나눌수있는피제수방향으로파란색굵은 선, 즉화살표가생성된것을확인할수있다. NetworkX 였다. Windows에서사용할수있는다른그래프그리기패키지로는 igraph가있는데, 현재로써 igraph는그래프분석과생성을할수있으나이를시각화하는모듈인 pycairo 의버그로인해그래프를가시화할수없다는문제점이있었다. Graphviz를사용하는 pygraphviz, pydot 등은자체의버그로인해사용이불가능하였다. 따라서 Python으로그래프를그려가시화하기위한패키지로는 NetworkX가가장적합하다고할수있다. NetworkX는표준그래프이론과통계물리학기능, 많은전형적인그래프와합성네트워크를지원하므로그래프를그리기에도알맞고, tutorial과
REP - NETWORK X - 019, JULY 2010 10 (a) node 10 개 (b) node 30 개 (c) node 50 개 (d) node 100 개 (e) node 500 개 (f) 1000 개 그림 10. node 수에 따른 그래프 9 의 모습. node 가 30 개일 때는 node 와 edge label 을 모두 식별할 수 있으나, 50 개 이상의 node 를 가지는 그래프는 정확한 식별이 어렵 다. node 가 100 개를 초과하면 사실상 그래프를 인지하는 것은 불가능하다고 볼 수 있 다. reference 가 잘 정리되어 있어 NetworkX 로 그래프를 그려보지 않은 사용자도 쉽게 배울 수 있도록 지원하고 있다. 다만, 한 그래프의 노드 수가 100 개 이상일 경우, 사실상 그래프를 육안으로 식별하 기가 불가능하므로 많은 수의 노드를 사용하기에는 부적합하다고 여겨진다. 따라서 노드 수가 50 개 이하인 간단한 그래프를 그리기 위한 목적으로만 사용하는 것이 바람직하다. 참고 문헌 1. Mark Lutz, Programming Python, vol. 1, O REILLY, 1005 Gravenstein Highway North, Sebastopol, CA 95472, 2006. 2. pygraphviz, Pygraphviz, http://networkx.lanl.gov/pygraphviz/. 3. Pydot, Pydot, http://code.google.com/p/pydot/. 4. igraph, igraph, http://igraph.sourceforge.net/. 5. NetworkX, Networkx, http://networkx.lanl.gov/. 6. igraph, igraph gallery, http://igraph.sourceforge.net/screenshots.html. 7. NetworkX, Networkx gallery, http://networkx.lanl.gov/gallery.html.