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

[graphviz] 그래프 구성 요소 꾸미기 (feat. graph, node, edge)

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

안녕하세요~ 꽁냥이에요. 지난 포스팅에서는 graphviz에서 기본적인 그래프를 그려보았다면 이번 포스팅에서는 graphviz에서 정의하는 각 요소 graph, node 그리고 edge를 꾸미는 방법에 대해서 알아보겠습니다. 


   그래프 구성 요소 꾸미기

1) 글로벌 설정과 개별 설정

그래프 구성 요소를 꾸미는 방법에는 글로벌하게 설정하는 방법과 구성 요소 개별 설정 방법이 있습니다. 글로벌 설정 또는 기본 설정은 Graph 객체의 attr 메서드를 이용합니다. attr 메서드는 첫 번째 인자로 구성 요소를 뜻하는 문자열 'graph', 'node', 'edge' 중 하나가 올 수 있습니다. 그리고 두 번째 인자로 구성 요소의 속성과 값을 딕셔너리로 전달하게 됩니다. 아래 예시는 구성 요소 node의 모양을 박스로 하겠다는 뜻입니다.

 

attr( 'node', { 'shape' : 'box' } )

 

개별 설정은 말 node, edge를 원하는 부분만 개별적으로 설정하겠다는 뜻이며 Graph 객체의 node 메서드와 edge 메서드로 설정할 수 있습니다. 이때 개별 설정이 글로벌 설정(기본 설정)보다 우선적으로 적용됩니다.

 

이제 코드를 통해서 알아보겠습니다.

 

from graphviz import Graph

g = Graph('Undirected', filename='02_decorate.gv', format='png')

## 글로벌 설정
## 그래프 글로벌 설정
g.attr('graph', {'rankdir':'LR'}) ## 그래프 방향 왼쪽에서 오른쪽
# g.graph_attr = {'rankdir':'LR'} 과 동일
# g.attr(rankdir='LR') 과 동일

## 노드 글로벌 설정
g.attr('node', {'shape':'circle', 'style':'dotted'})
# g.node_attr = {'shape':'circle', 'style':'dotted'} 과 동일

## 엣지 글로벌 설정
g.attr('edge', {'style':'dashed'})
# g.edge_attr = {'style':'dashed'} 과 동일

## 개별 요소 설정
## 개별 노드 설정
g.node('A', shape='box')
g.node('B')
g.node('C')

## 개별 엣지 설정
g.edge('A', 'B')
g.edge('B', 'C')
g.edge('C', 'C', color='#FF43A2', style='solid')

g.view()
print(g.source)

 

line 7

먼저 graph 요소를 글로벌 설정하는 코드입니다. 이때 'rankdir'은 그래프 진행 방향을 설정하는 인자이며 'LR'은 Left,  Right의 약자로 왼쪽에서 오른쪽이라는 뜻입니다. 위에서 아래쪽은 Top, Bottom의 약자를 따서 'TB'로 설정하면 됩니다. 바로 아래 두 개의 주석을 실행해도 동일한 결과를 얻습니다.

 

line 12

node 요소를 글로벌 설정하는 코드입니다. 이때 node 모양은 원, 테두리는 점선으로 그리겠다는 뜻입니다. 바로 아래 주석도 동일한 작업을 하는 코드입니다.

 

line 16

edge 요소를 글로벌 설정하는 코드입니다. 여기서는 edge를 dashed 선으로 설정했습니다. 아래 주석 또한 같은 기능을 합니다.

 

line 21

노드 A의 모양을 박스로 개별 설정한 것입니다.

 

line 28

노드 C와 자기 자신을 연결하는 edge의 선 색상과 스타일을 개별 설정한 것입니다.

 


2) 구성 요소 꾸미기

a. graph, node 꾸미기

graph는 Graph 객체의 attr 또는 graph_attr로 여러 가지 옵션을 설정할 수 있습니다. 주로 그래프 진행 방향을 나타내는 rankdir 인자가 많이 사용됩니다. graph 설정과 관련된 내용은 여기를 참고해주세요.

 

다음으로 node에는 배경색 추가, 테두리 설정 등 여러 가지를 설정할 수 있습니다. node 설정과 관련된 다른 인자가 궁금하신 분들은 여기를 참고해주세요. 또한 node의 모양을 설정하는 shape인자가 있는데 graphviz에서 지원하는 shape에는 어떤 것들이 있는지 알고 싶으신 분은 여기를 참고해주세요.

 

아래 코드를 통해 graph와 node 설정 방법을 알 수 있습니다. 이때 배경색을 설정하는 fillcolor 인자는 style 인자에 'filled'가 포함되어 있어야 정상적으로 작동합니다.  나머지 부분은 주석을 참고해주세요. 

 

## 그래프 노드 꾸미기
g = Graph('Node', filename='node.gv', format='png')

## 글로벌 설정
g.attr('graph', {'rankdir':'LR'})
g.attr('node', {'shape':'circle'})

## 개별 노드 설정
g.node('A',
       style='filled, dotted', ## 배경색 채우기+테두리 점선
       fillcolor='#FF33F#', ## 배경색
       color='blue', ## 테두리 컬러
      )

g.node('B',
       style='dashed', ## 테두리 스타일
       peripheries='2', ## 테두리 이중선 '3' = 삼중선
      )
g.node('C',
       label='Hello', ## 라벨
       width='1', ## 노드 폭
       penwidth='2' ## 테두리 두께
      )

g.edge('A', 'B')
g.edge('B', 'C')
g.edge('C', 'C')

g.view()
print(g.source)

 

위 코드를 실행하면 아래와 같은 그래프를 얻을 수 있습니다.

b. edge 꾸미기

edge는 선 스타일, 선 색상 등 여러 가지를 설정할 수 있습니다. graphviz에서 제공한 edge 관련 전체 인자들은 여기를 참고하시고 아래 코드는 그 중에서 자주 사용되는 것들을 소개한 것입니다. 주석을 참고하면 그 사용법을 알 수 있을 거예요.

 

## 그래프 노드 꾸미기
g = Graph('Node', filename='node.gv', format='png')

## 글로벌 설정
g.attr('graph', {'rankdir':'TB'})
g.attr('node', {'shape':'circle'})

## 개별 노드 설정
g.node('A')
g.node('B')
g.node('C', label='Hello')
g.node('D', label='World')

g.edge('A', 'B', 
       style='invis' ## invisible 엣지 안보이게
      )
g.edge('B', 'C', 
       dir='forward', ## 화살표 방향
       arrowhead='none', ## 화살표 모양 = 없음
       style='tapered', ## 선이 점점 가늘어짐
       color='red', ## 엣지 선 색상
       penwidth='4', ## 선 두께
      )
g.edge('C', 'D', 
       style='solid', ## style=''과 동일 
      )

g.view()
print(g.source)

 


이번 포스팅에서는 그래프 구성 요소를 꾸미는 방법에 대해서 알아보았습니다. 다음 포스팅에서는 Subgraph와 Cluster에 대해서 소개하겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 안녕히 계세요~


댓글


맨 위로