ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NetworkX] 가중그래프, Weighted Graph (파이썬 네트워크 분석 2)
    Data & ML & AI/NetworkX 2022. 7. 31. 11:32
    반응형

    가중 그래프 생성하고 그리기

    가중 그래프는 노드와 노드 사이의 관계가 가중치를 가지는 그래프를 의미합니다.

    아래의 그래프 예시에서는 '같이 점심을 먹은 횟수'입니다.

    이외에도 장소A와 장소B 간의 거리나 이동시간 등을 가중치로 메겨볼 수도 있습니다.

     

    1) 그래프 생성하기

    import networkx as nx
    %matplotlib notebook
    
    G = nx.Graph()
    G.add_edge('B','A',weight=6)
    G.add_weighted_edges_from([('B','C',13),('C','F',21),('C','E',25),
                               ('E','D',2),('G','F',9),('H','E',9),
                               ('E','I',10),('E','J',15),('I','J',3)])

    비가중그래프(이전 포스트에서 다루었던 단순 무방향/방향 그래프)와 마찬가지로,

    엣지 하나만 추가할 때는 G.add_edge()weight속성만 추가해서 사용하면 됩니다.

     

    하지만 한번에 여러개를 추가할 때는 add_edges_from()이 아닌, add_weighted_edges_from()메소드를 사용해야 합니다.

     

    사실 add_edges_from()를 사용하는 방법이 있기는 한데...

    G.add_edges_from([('B','C',{'weight':13}),('C','F',{'weight':21}),('C','E',{'weight':25}),
                      ('E','D',{'weight':2}),('G','F',{'weight':9}),('H','E',{'weight':9}),
                      ('E','I',{'weight':10}),('E','J',{'weight':15}),('I','J',{'weight':3})])

    직접 타이핑 하는거라면 좀 더 귀찮습니다. (직접 타이핑하는 경우가 얼마나 있겠냐만...)

     

    2) 그래프 그리기

    그래프 생성하기와 그리기를 분리한 이유가 있습니다.

    이전처럼 단순하게 nx.draw_networkx(G)로 그려보겠습니다.

    nx.draw_networkx(G)

    우리는 엣지의 가중치도 보고싶다

    가중치 그래프면 각 엣지가 가진 수치값도 보고싶은데 나타나지 않습니다.

     

    matplotlib에서 그래프 먼저 그리고, 그 위에 레이블값을 추가로 그려주는 것 처럼,

    여기서도 엣지의 weight 값을 따로 얹어서 그려줘야 합니다.

    그러기 위해선 노드와 엣지를 어디에 그릴지 지정하는 position 정보를 지정해야 합니다.

    pos=nx.spring_layout(G) # 각 노드, 엣지를 draw하기 위한 position 정보
    print(pos)
    # {'A': array([ 1.       ,  0.5754437]),
    #  'B': array([ 0.74864446,  0.48083842]),
    #  'C': array([ 0.51352205,  0.38765522]),
    #  'D': array([ 0.        ,  0.84189383]),
    #  'E': array([ 0.29857935,  0.46694334]),
    #  'F': array([ 0.60702277,  0.20606113]),
    #  'G': array([ 0.71158156,  0.        ]),
    #  'H': array([ 0.2561265 ,  0.68081613]),
    #  'I': array([ 0.13787348,  0.30973299]),
    #  'J': array([ 0.11470259,  0.47097791])}
    
    # 노드, 엣지 그리기
    nx.draw(G,pos,with_labels=True) # with_labels: 각 노드 이름 표시 여부
    
    # 엣지 정보 덧그리기
    nx.draw_networkx_edge_labels(G,pos)

    {'weight':00}의 형태로 나타납니다.

    잘 표시되기는 했는데 좀 많이 더러워보입니다.

    엣지가 가진 label값을 모두 그려넣었기 때문입니다.

     

    weight값만 따로 그려줍시다

    pos=nx.spring_layout(G) # 각 노드, 엣지를 draw하기 위한 position 정보
    weight = nx.get_edge_attributes(G, 'weight')
    
    nx.draw(G,pos,with_labels=True)
    nx.draw_networkx_edge_labels(G,pos, edge_labels=weight)

    깔끔한 그래프가 잘 그려졌습니다.

     

    본 게시물은 Coursera의 Applied Social Network Analysis in Python(by Daniel Romero)를 통해 자습하며 작성한 게시물입니다.

    반응형

    댓글

Designed by Tistory.