NetworkX에서 그래프의 엣지(edge)를 가중치(weight) 값에 따라 다른 색으로 표현하면, 데이터의 흐름이나 연결의 강도를 한눈에 파악할 수 있습니다. 이 글에서는 Matplotlib과 함께 NetworkX를 사용하여 엣지를 가중치별로 색칠하는 방법을 단계별로 살펴보겠습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
- 엣지, 노드 이름 또는 그래프 속성을 포함하는 그래프를 초기화합니다.
- 현재 그래프에 노드를 추가합니다.
- 현재 그래프의 노드들 사이에 엣지를 추가합니다.
- 그래프의 엣지를 순회하면서 각 엣지에 가중치 값을 할당합니다.
- 엣지 색상을 가중치 기준으로 하여 현재 그래프를 그립니다.
- 그림을 화면에 표시하려면 show() 메서드를 사용합니다.
예제 코드
import random as rd
import matplotlib.pylab as plt
import networkx as nx
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
G = nx.DiGraph()
G.add_nodes_from([1, 2, 3, 4])
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 1), (1, 3)])
for u, v, d in G.edges(data=True):
d['weight'] = rd.random()
edges, weights = zip(*nx.get_edge_attributes(G, 'weight').items())
nx.draw(G, node_color='b', edge_color=weights, width=2, with_labels=True)
plt.show()
코드 설명
위 코드의 핵심 부분을 자세히 살펴보겠습니다.
1. 그래프 생성: nx.DiGraph()로 방향 그래프를 만들고, add_nodes_from()과 add_edges_from()을 사용해 노드 4개와 엣지 5개를 추가합니다.
2. 가중치 할당: G.edges(data=True)를 순회하면서 각 엣지의 속성 딕셔너리에 rd.random()으로 생성한 0~1 사이의 무작위 가중치를 저장합니다. 실제 프로젝트에서는 이 부분을 실제 데이터 값으로 대체하면 됩니다.
3. 가중치 추출: nx.get_edge_attributes(G, 'weight')는 {(엣지): 가중치} 형태의 딕셔너리를 반환하며, zip(*...)을 통해 엣지 목록과 가중치 목록을 분리합니다.
4. 그래프 그리기: nx.draw() 호출 시 edge_color=weights를 전달하면, 가중치 값이 컬러맵(color map)에 매핑되어 엣지마다 다른 색상이 자동으로 적용됩니다. 노드는 파란색('b')으로, 라벨은 함께 표시됩니다.
실행 결과
코드를 실행하면 가중치 크기에 따라 색상이 다르게 표현된 방향 그래프가 출력됩니다. 색상 차이를 통해 어떤 연결이 강하고 약한지 시각적으로 쉽게 구분할 수 있습니다.
참고로, 특정 컬러맵을 지정하고 싶다면 nx.draw()에 edge_cmap=plt.cm.Reds 같은 인자를 추가하거나, edge_vmin/edge_vmax로 색상 범위를 조절할 수도 있습니다.