본문 바로가기
데이터 분석/시각화

[graphviz] 기본 구성 요소 알아보기 (feat. Graph, Digraph, node, edge)

by 부자 꽁냥이 2022. 10. 24.

안녕하세요~ 꽁냥이에요. 꽁냥이는 요즘 파이썬(Python)에서 Graphviz를 이용한 그래프 시각화를 공부하고 있는데요. 공부하면서 배운 내용을 정리하려고 합니다.

 

이번 포스팅에서는 Graphviz의 기본 구성 요소인 Graph, Digraph, node, edge의 개념을 알아보고 이를 그려보는 방법을 알아보려고 합니다.


   Graphviz 설치

Graphviz를 사용하려면 먼저 내 컴퓨터에 graphviz를 설치하고 환경 변수에 등록하는 과정이 필요합니다. 해당 내용은 아래 포스팅을 참고해주세요. 

 

graphviz 설치하기

 

[오류 해결] ExecutableNotFound: failed to execute ['dot', '-Kdot', '-Tsvg'], make sure the Graphviz executables are on your

안녕하세요~ 꽁냥이에요. 꽁냥이는 요즘 graphvis 사용법을 배우고 있는데요. pip install graphviz를 실행하여 설치만 하면 되는 줄 알았는데 아니더라고요. 저 같은 경우 아래 코드를 실행했는데 오류

zephyrus1111.tistory.com

 

다음으로 graphviz를 파이썬에서 사용하기 위해 아래 명령어(pip install)를 통해 설치해줍니다.

 

pip install graphviz

   Graphviz의 구성 요소

1) 정의

먼저 Graph, Digraph, node, edge의 정의는 다음과 같습니다.

 

Graph : 방향성이 없는 그래프(Undirected Graph)

Digraph : 방향성이 있는 그래프(Directed Graph)

node : 노드

edge : 노드와 노드를 연결하는 선

 

여기서 node와 edge가 그래프를 구성하는 기본적인 단위이며 이들이 모여 Graph 또는 Digraph가 됩니다.


2) 그래프 그리기

이번엔 파이썬(Python)에서 graphviz를 이용하여 앞에서 배운 각 구성 요소를 그려보도록 하겠습니다.

a. Graph 그리기

아래 코드는 두개의 node와 하나의 edge를 갖는 Graph를 생성하고 이를 png 형식으로 저장합니다. 코드를 하나하나 살펴보겠습니다.

 

from graphviz import Graph

g = Graph(name='Undirected', ## 그래프 이름
          comment='basic', ## 코멘트 소스 텍스트 첫 번째 줄에 표시됨.
          filename='01_basic', ## 파일 이름
          format='png', ## 파일 형식
          directory='./', ## 파일 저장 디렉토리
          )
g.node(name='A') ## 노드 A 생성, g.node('A')와 동일
g.node(name='B') ## 노드 B 생성, g.node('B')와 동일
g.node(name='C') ## 노드 C 생성, g.node('B')와 동일

g.edge(tail_name='A', head_name='B') ## edge 생성, g.edge('A', 'B')와 동일
g.edge(tail_name='B', head_name='C') ## edge 생성, g.edge('A', 'B')와 동일
## g.edges(['AC', 'BC'])과 동일

g.view() ## 사전에 정의한 format으로 저장 및 파일 열기
print(g.source) ## 소스 텍스트 출력

 

line 3~8

먼저 Graph 클래스를 생성합니다. 이때 name 인자는 그래프의 이름, comment는 소스 텍스트 출력 시 첫 번째 줄에 표시되는 텍스트입니다. 또한 filename은 파일 이름, format은 파일 저장 포맷, directory는 파일 저장 디렉터리를 의미합니다.

 

line 9~11

노드는 Graph 클래스의 node 메서드를 통해 생성할 수 있습니다. 노드를 생성할 때에는 기본적으로 name 인자를 통해 노드 이름을 지정해줘야 합니다. name 인자를 생략하고 문자열을 입력해도 됩니다. 

 

line 13~14

엣지는 edge 메서드를 통하여 생성할 수 있습니다. 이때 tail_name과 head_name을 지정합니다. 인자를 생략하고 두 개의 문자열을 입력해도 됩니다. 또한 edges 메서드를 이용하여 연결하고자할 두개의 노드를 길이가 2인 문자열로 하는 리스트를 전달하여 한꺼번에 edge를 만들 수도 있습니다.

 

line 17

앞에서 정의한 그래프를 파일로 저장하고 브라우저에 해당 파일을 열어줍니다.

 

line 18

그래프 서술 텍스트를 출력합니다.

 

코드를 생성하면 아래 왼쪽과 같은 그래프가 생성되며 오른쪽과 같은 그래프 서술 텍스트(소스 텍스트)가 출력됩니다.

 

Graph 결과(왼쪽)와 이에 대응하는 그래프 서술 텍스트(오른쪽). 그래프 서술 텍스트 첫 번째 줄은 Graph 생성시 comment 인자에 넣어준 텍스트이다.

 

b. Digraph 그리기

이번에는 Digraph를 그려보겠습니다. 그리는 방법은 Graph와 동일하므로 설명은 주석으로 대체합니다.

 

from graphviz import Digraph

## Directed Graph
g = Digraph(name='Directed', ## 그래프 이름
          comment='basic', ## 코멘트 소스 텍스트 첫 번째 줄에 표시됨.
          filename='02_basic', ## 파일 이름
          format='png', ## 파일 형식
          directory='./', ## 파일 저장 디렉토리
          )
g.node(name='A') ## 노드 A 생성, g.node('A')와 동일
g.node(name='B') ## 노드 B 생성, g.node('B')와 동일
g.edge(tail_name='A', head_name='B') ## edge 생성, g.edge('A', 'B')와 동일

g.view() ## 사전에 정의한 format으로 저장 및 파일 열기
print(g.source) ## 소스 텍스트 출력

 

위 코드를 실행하면 아래 왼쪽 그림과 같이 방향성이 있는 그래프가 그려진 것을 알 수 있습니다.

 

Digraph 결과(왼쪽)와 이에 대응하는 그래프 서술 텍스트(오른쪽).


이번 포스팅에서는 graphviz의 기본 구성 요소에 대해서 알아보았습니다. 다음 포스팅에서는 노드(node)와 엣지(edge)를 꾸미는 방법에 대해서 알아보겠습니다.

 

지금까지 꽁냥이 글 읽어주셔서 감사합니다.


댓글


맨 위로