본문 바로가기

Python

파이썬 networkx(graph 노드 위치 설정)

지난 포스팅에서는 networkx에서 네트워크에 edge와 node를 추가하는 것을 작성했다. 

 

이번 포스팅에서는 그래프를 구성하는 노드들의 위치를 설정하는 방법을 작성해보려고 한다. 

 

아래코드는 지난번 포스팅에서 작성했던 코드로, 코드를 실행할때마다 노드들의 위치가 계속해서 변경된다.

g1 = nx.Graph()                # 무방향성 그래프 g1을 생성 

g1.add_nodes_from([1,2,3,4,5])                  # 생성한 g1그래프에 노드 1을 생성(추가) 

g1.add_edges_from([(1,2), (2,3), (1,5), (3,5), (4,5)])         # 생성한 g1그래프에 edge를 생성(추가) 

g1.add_edge(1,3, weight=3)         # node1,3을 연결하는 edge의 weight를 3으로 설정
 
g1.add_weighted_edges_from([(1,2,3),(2,3,4)])   # node 1,2을 연결하는 edge의 weight를 3으로 설정
                                                                                    # node 2,3을 연결하는 edge의 weight를 4으로 설정

pos = nx.spring_layout(g1)      # 네트워크에서 노드들의 위치를 결정하는 코드임. 

labels =nx.get_edge_attributes(g1,'weight').     # labels을 edge의 weight로 정의

nx.draw_networkx_edge_labels(g1, pos, edge_labels = labels)     # label을 표시 그래프에 표시

nx.draw(g1, pos, with_labels=True)    # 그래프를 그림

 

하지만 위의 코드에 몇문장을 더 추가하면 노드들의 위치를 사용자가 지정할 수 있다.  먼저 코드를 먼저 살펴보고 난 이후

천천히 설명해보겠다.

g1 = nx.Graph()                # 무방향성 그래프 g1을 생성 
g1.add_nodes_from([1,2,3,4,5])                  # 생성한 g1그래프에 노드 1을 생성(추가) 
g1.add_edges_from([(1,2), (2,3), (1,5), (3,5), (4,5)])         # 생성한 g1그래프에 노드 1,2,3,4,5를 생성(추가) 
g1.add_edge(1,3, weight=3)         # node1,3을 연결하는 edge의 weight를 3으로 설정
g1.add_weighted_edges_from([(1,2,3),(2,3,4)])   # node 1,2을 연결하는 edge의 weight를 3으로 설정
                                                                                    # node 2,3을 연결하는 edge의 weight를 4으로 설정

pos = {1:[1,13],  2:[2,3],  3:[3,4],  4:[4,5],  5:[6,7]} # 노드 1의 좌표를 x축 1, y축 13, 노드2의 좌표를 x축 2, y축 3

labels =nx.get_edge_attributes(g1,'weight').     # labels을 edge의 weight로 정의
nx.draw_networkx_edge_labels(g1, pos, edge_labels = labels)     # label을 표시 그래프에 표시
nx.draw(g1, pos, with_labels=True)    # 그래프를 그림

위에서 파란색 문장이 새롭게 추가된 코드이다. 해당 코드는 이렇게 설명할 수 있다.

 

pos라는 dictionary의 key를 노드이름, 그리고 value를 x,y좌표의 리스트로 설정한 것이다. 

 

그냥 쉽게 pos = {노드이름 : [x축, y축]} 이렇게 이해하면 될 것이다. 

 

아래 코드는 또다른 예제이며, 출력시 아래의 그림과 같이 그래프가 생성된다. 

g2 = nx.Graph()
for i in range(0,26):
      g2.add_node(i)

pos = {}

for i in range(0,10):
     pos.update({i:[i,5*i]})

for i in range(10,20):
     pos.update({i:[i,-5*i+95]})

for i in range(20,26):
      pos.update({i:[2*i-35,20]})

nx.draw(g2, pos, with_labels=True)

'Python' 카테고리의 다른 글

파이썬 내장함수  (0) 2022.01.22
딕셔너리(Dictionary) 사용법 정리  (0) 2022.01.17
파이썬 리스트(list) 사용법 정리  (0) 2022.01.15
파이썬 Networkx (node와 edge 제거)  (0) 2022.01.07
파이썬 Networkx (node, edge 생성)  (0) 2022.01.04