NetworkX t Python łŸ ÜT - Pusan National...
Transcript of NetworkX t Python łŸ ÜT - Pusan National...
REP - NETWORKX - 019, JULY 2010 1
NetworkX를이용한 Python그래프가시화Graph Visualization from Python Using NetworkX
김선영
Kim SeonYeong
부산대학교 컴퓨터공학과
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 이다. 각 패키지의 종류와 각각에
대한 자세한 내용은 다음과 같다.
Copyright © Graphics Application Lab. Pusan National University
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와 같이 다양한 옵션을 통해 제공하고
Copyright © Graphics Application Lab. Pusan National University
REP - NETWORKX - 019, JULY 2010 3
(a) Fruchterman-Reingold
Force based Layout (b) Kautz Graph with Adjacency Matrix (c) Erdos-Renyi 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 사이에서 네트워크 알고리즘의 쉬운 변경
Copyright © Graphics Application Lab. Pusan National University
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를 이용한 다양한 그래프 레이아웃
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에서 잘 동작하나 이후 그래프
알고리즘을 시각화하는 모듈이 이 버전을 지원하지 않는다. 적합하지 않은 버전을 설치하면 예
제가 실행되지 않는다.
Copyright © Graphics Application Lab. Pusan National University
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를 생성할 수 있는데, 가장 많이
Copyright © Graphics Application Lab. Pusan National University
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과 같다.
Copyright © Graphics Application Lab. Pusan National University
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개로 늘려 그래프를 생성하였다. 결과는
Copyright © Graphics Application Lab. Pusan National University
REP - NETWORKX - 019, JULY 2010 8
그림 6. node 위치 지정해서 그리기
그림 7. 그림 6 를 실행한 결과. house graph로 node가 지정한 위치에 배치되었음을
확인할 수 있다.
그림 10 과 같다.
그림 10를 통해 node가 100개를 초과하면 사실상 그래프를 식별하기가 불가능하다고 볼 수 있
다. 따라서 NetowkrX로 그래프를 생성할 때 사용가능한 node의 수는 50개를 초과하지 않는 것이
바람직하다고 여겨진다.
4 결론
본 보고서에서는 Python으로 자료 구조 그래프를 그리는 무료 패키지, 라이브러리와 모듈에 대해서
조사하고 그 중 현재 사용하기 가장 적합한 NetworkX에 대해서 그 기능과 설치 방법, 예제를 살펴
보았다. 여러가지 라이브러리와 패키지가 존재하나 Windows 운영체제와 호환 가능한 라이브러리는
Copyright © Graphics Application Lab. Pusan National University
REP - NETWORKX - 019, JULY 2010 9
그림 8. 1부터 10까지의 숫자 중, 피제수가 제수로 나누어 질 경우 제수에서 피제수
방향으로 화살표를 생성한다.
그림 9. 그림 8 를 실행한 결과. 제수가 나눌 수 있는 피제수 방향으로 파란색 굵은
선, 즉 화살표가 생성된 것을 확인할 수 있다.
NetworkX 였다. Windows에서 사용할 수 있는 다른 그래프 그리기 패키지로는 igraph가 있는데,
현재로써 igraph는 그래프 분석과 생성을 할 수 있으나 이를 시각화하는 모듈인 pycairo의 버그로
인해 그래프를 가시화 할 수 없다는 문제점이 있었다. Graphviz를 사용하는 pygraphviz, pydot 등
은 자체의 버그로 인해 사용이 불가능하였다. 따라서 Python으로 그래프를 그려 가시화하기 위한 패
키지로는 NetworkX가 가장 적합하다고 할 수 있다. NetworkX는 표준 그래프 이론과 통계 물리학
기능, 많은 전형적인 그래프와 합성 네트워크를 지원하므로 그래프를 그리기에도 알맞고, tutorial과
Copyright © Graphics Application Lab. Pusan National University
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개를 초과하면 사실상 그래프를 인지하는 것은 불가능하다고 볼 수 있
다.
reference가 잘 정리되어 있어 NetworkX로 그래프를 그려보지 않은 사용자도 쉽게 배울 수 있도록
지원하고 있다. 다만, 한 그래프의 노드 수가 100개 이상일 경우, 사실상 그래프를 육안으로 식별하
기가 불가능하므로 많은 수의 노드를 사용하기에는 부적합하다고 여겨진다. 따라서 노드 수가 50개
이하인 간단한 그래프를 그리기 위한 목적으로만 사용하는 것이 바람직하다.
참고 문헌
1. Mark Lutz, Programming Python, vol. 1, O’REILLY, 1005 Gravenstein Highway North, Sebastopol, CA95472, 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.
Copyright © Graphics Application Lab. Pusan National University