REP - networkx - 019, JULY 2010 1 NetworkX를 이용한 Python 그래프 가시화 Graph Visualization from Python Using NetworkX 부산대학교 컴퓨터공학과 김선영 E-mail : s.y.kim@pusan.ac.kr Revised on 2010.07.27 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 계열에 호환되
REP - networkx - 019, JULY 2010 2 어 있고 Windows 계열도 지원하지만, Winodws OS의 경우 많은 버그를 가지고 있기 때문에 현재 Windows 운영 체제와 정상적으로 호환되는 패키지는 NetworkX 이다. 각 패키지의 종류와 각각에 대 한 자세한 내용은 다음과 같다. 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으
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 등 보다 더 다양한 그래프 레이 아웃을 사용할 수 있다. 로 그래프 알고리즘을 사용하는 사용자들에게 많이 알려져 있다. igraph와 같이 visualization 부 분을 포함하고 있지 않기 때문에 matplotlib 라이브러리를 사용하여 viewing 기능을 제공한다. pygraphviz를 내장하여 그래프 레이아웃을 Graphviz와 같이 다양한 옵션을 통해 제공하고자 하 였으나, 앞서 소개하였던 이유와 마찬가지로 pygraphviz를 사용할 수 없기 때문에 그래프 레이아 웃에 있어서는 제한적이다. 그러나 정상적으로 잘 동작하고 버그도 지속적으로 수정되는 등 업데 이트가 잘 이루어지므로 현재 Python으로 그래프를 그리기에는 가장 적합한 패키지가 NetworkX 라고 할 수 있다. 3 NetworkX의 기능 소개 및 사용 예 3.1 NetworkX의 특징 NetworkX는 복잡한 네트워크의 기능, 구조와 역학의 생성, 계산과 연구를 위한 Python package로, 주요 특징은 다음과 같다.
REP - networkx - 019, JULY 2010 4 (a) 이항확률그래프에서의 컴포넌트 연결 출현 일러스트레이트 (b) Circular Tree (c) Random Geometric Graph (d) Atlas of all graphs of 6 nodes or less (e) Grid (f) miles graph 그림 2. NetworkX를 이용한 다양한 그래프 레이아웃 1. 표준 그래프이론과 통계물리학 기능 2. applications, disciplines, platforms 사이에서 네트워크 알고리즘의 쉬운 변경 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개로 구성한 간단한 그래프
REP - networkx - 019, JULY 2010 6 1. add_edge : NetworkX는 여러가지 함수를 통해 node와 edge를 생성할 수 있는데, 가장 많이 사 용하는 함수가 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과 reference가
REP - networkx - 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개를 초과하면 사실상 그래프를 인지하는 것은 불가능하다고 볼 수 있다. 잘 정리되어 있어 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.