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

[graphviz] subgraph와 cluster 그려보기

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

안녕하세요~ 꽁냥이에요. 요즘 graphviz를 공부하면서 배운 내용을 포스팅하고 있는데요. 이번 포스팅에서는 subgraph와 cluster에 대한 개념을 알아보고 이를 그려보는 방법에 대해서 소개합니다. 이번 포스팅은 그래프 구성 요소 꾸미는 방법을 안다고 가정하고 보셔야 하는데요. 혹시 관련 내용에 익숙지 않으신 분들은 아래 포스팅을 읽고 와주시면 됩니다.

 

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

 

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

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

zephyrus1111.tistory.com


   subgraph와 cluster

1) 정의

먼저 subgraph는 graph의 부분 집합이라고 생각하면 됩니다. 즉, graph가 갖고 있는 노드와 엣지들의 집합 중 일부를 subgraph라고 생각하면 되는 것입니다. subgraph는 graph의 특정 부분을 꾸미고 싶을 때 사용할 수 있습니다. 아래 그림을 보면 왼쪽이 graph이고 오른쪽이 (graph의 노드와 엣지를 일부 가져온) subgraph입니다.

graph(왼쪽)와 subgraph(오른쪽) graphviz

 

cluster는 subgraph로써 graph에서 해당 subgraph 부분을 경계선으로 감싼 것을 말합니다. cluster는 graph의 특정 부분을 꾸미고 싶을 때 사용한다는 점에서 subgraph와 같지만 해당 부분을 경계선으로 둘러쌈으로써 보는 사람들로 하여금 클러스터라는 것을 강조할 수 있는 차이가 있습니다.

 

아래 그림에서 빨간 동그라미 안을 보시면 subgraph와는 달리 cluster는 cluster 내의 노드와 엣지를 감싸는 경계선이 추가되어 있는 것을 알 수 있습니다. 하지만 cluster만을 출력하면 subgraph와 같아지지요. 왜냐하면 그 자체가 cluster 이므로 굳이 경계선으로 구분할 필요가 없어지기 때문입니다.

graph와 subgraph 그리고 cluster의 포함 관계는 다음과 같습니다.

 

 

이제 subgraph와 cluster를 그려보는 방법에 대해서 알아보겠습니다.


2) subgraph, cluster 그리기

a. subgraph

subgraph는 Graph(또는 Digraph)로 정의한 뒤 기존에 정의되어 있는 Graph(또는 Digraph) 객체의 subgraph 메서드를 통하여 삽입할 수 있습니다. 아래 코드는 graph의 subgraph(c, d, e 노드와 하나의 엣지를 포함)를 삽입한 것입니다. 코드 보시면 금방 이해되실 거예요.

 

from graphviz import Digraph

g = Digraph('main_graph', filename='subgraph.gv', format='png')

g.edge('a', 'b')

## sub graph 정의
sg = Digraph('sub_graph')
sg.attr('node', {'shape':'box', 'color':'red'})
sg.node('c')
sg.edge('d', 'e')

g.subgraph(sg) ## subgraph 삽입
g.node('f')
g.edge('g', 'h')
g.edge('c', 'a')

g.view()
print(g.source)

 

위 코드를 실행하면 다음과 같이 subgraph 부분에 포함된 노드들이 빨간 박스로 표시된 것을 알 수 있습니다. 앞에서도 말씀드렸지만 subgraph는 전체 graph에서 일부 그래프를 꾸미고자 할 때 유용하게 쓰일 수 있습니다.

graphviz -  subgraph

b. cluster

cluster는 subgraph와 같은 방법으로 삽입할 수 있습니다. 차이점은 name 인자에 'cluster_'로 시작되는 이름을 사용해야 cluster로 인식됩니다.

 

g = Digraph('main_graph', filename='cluster.gv', format='png')

g.edge('a', 'b')

## cluster 정의
cluster = Digraph('cluster_1')
cluster.attr('graph', {'color':'green', 'fillcolor':'yellow', 'style':'filled, dashed'})
cluster.attr('node', {'shape':'box', 'color':'red'})
cluster.node('c')
cluster.edge('d', 'e')

g.subgraph(cluster) ## cluster 삽입
g.node('f')
g.edge('g', 'h')
g.edge('c', 'a')

g.view()
print(g)

 

위 코드를 실행하면 아래와 같이 cluster가 잘 삽입된 것을 알 수 있습니다.

 

graphivz - cluster


이번 포스팅에서는 subgraph와 cluster를 그리는 방법에 대해서 알아보았습니다. 이번에 배운 내용은 계층적 구조를 갖는 그래프를 그릴 때 사용될 수 있어요. 계속 공부해서 멋진 그래프를 만들 수 있으면 좋겠습니다. 부디 이번 포스팅이 많은 분들께 도움이 되시길 바라며 이상 포스팅 마치겠습니다. 감사합니다~


댓글


맨 위로