본문 바로가기

Python

파이썬 Networkx (node와 edge 제거)

지난번 포스팅에서는 Networkx의 가장 기본적인 node와 edge생성하는 방법을 작성했다.

 

먼저 지난 포스팅에서 작성한 파이썬 코드는 아래와 같으며, 코드를 jupyter notebook에 입력해서 실행하면

아래 <그림1>와 같은 그래프가 생성된다. <그림1>은 예제일뿐, 코드를 실행시킬때마다 다른 그림이 나올 것이다. 

Import networkx as nx

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

g1.add_node(1)            # 생성한 g1그래프에 노드 1을 생성(추가)
g1.add_node("a")       # 생성한 g1그래프에 노드 "a"를 생성(추가)
g1.add_nodes_from( [2, 7, 3] )      # 생성한 그래프에 노드 2, 7, 3을 생성(추가) 

g1.add_edge(1,"a")   # 노드 1과 "a"를 연결하는 Edge를 생성(추가)
g1.add_edge(2,7)     # 노드 2와 7을 연결하는 Edge를 생성(추가)
g1.add_edges_from( [ (2,7), (1,"a")] )     # 노드 2와 7을 연결하는 Edge, 노드 1과 "a"를 연결하는 edge를 생성

nx.draw(g1)   #g1 그래프를 시각화 

 


<그림 1 >

먼저 불필요한 node와 edge를 제거하는 방법을 알아보자

1.  edge 제거 

edge를 제거하는 코드를 작성하기전, 그래프에서 노드의 번호를 표현하는 코드에 대해서 알아보자.

nx.draw(g1, with_labels = True, font_weight = "bold")   # g1그래프를 생성하고, 각 노드에 label을 표시, 글자는 bold체 

예시처럼 코드를 작성하면, 각 노드에 labeling이 되기 때문에 실습간에 edge가 없어지는 것을 쉽게 알 수 있을 것이다. 

이제 본격적으로 edge를 제거하는 코드에 대해서 알아보자

 

g1.remove_edge(2,7)         # g1그래프에서 node 2와 7을 연결한 edge를 제거

g1.remove_edge(1,"a")      # g1그래프에서 node 1와 "a"을 연결한 edge를 제거

g1.remove_edges_from( [2,7] , [1,"a"])  # g1그래프에서 node2와 7을 연결한 edge, node 1과 "a"를 연결한 edge를 제거

edge를 제거할때, 그래프에 존재하지 않는 edge를 제거하면 에러가 발생하는 것을 알아두자. 

 

2. node 제거

그래프에서 node를 제거하는 것은 edge를 제거하는 것과 매우 유사하기 때문에 코드 작성방법만 알아보고 넘어가겠다.

g1.remove_node(2)       # g1그래프에서 node2를 제거

g1.remove_nodes_from( [2,1] )      # g1그래프에서 node2와 node1을 제거

 

3. edge에 가중치를 추가하여, 그래프에 표현하기

네트워크를 시각화 할 때, 노드간의 거리등을 표시해야하는 경우가 있을 것이다. 그런경우 아래의 코드를 참고하면 좋을 것 같다.

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

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

g1.add_edges_from([(1,2), (2,3), (1,5), (3,5), (4,5)])      # edge 4개를 추가

nx.draw(g1, with_labels=True). 
<그림 2>

위의 코드를 입력하고 실행하면 <그림2>와 같이 나타날 것이다. 여기에서 2개의 edge에 길이를 표현해보겠다.

 

이를 위해서 방금 사용한 코드를 조금 수정해보겠다. 그리고 이를 실행하면 <그림3>과 같이 실행됨을 알 수 있다. 

 

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 = 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)    # 그래프를 그림
<그림 3>

여기서 pos는 그래프에서 노드의 위치를 결정하는 코드이며, 각 노드별로  x,y 좌표를 설정하여 그래프를 그릴 수 있게 한다.

 

자세한 사항은 다음 포스팅에서 작성하겠으며, 위의 예제에서는 단순히 노드의 위치를 설정하는 정도로 이해하면 될 것 같다. 

 

예제코드를 활용해서 조금씩 내용를 바꿔서 실행해보면 코드의 내용을 충분히 이해할 수 있을 거라 생각하며 

 

포스팅을 마치겠다.