python, pyTorch

그래프 예쁘게 그리기 2탄 : networkx.draw 함수

zooyeonii 2021. 8. 11. 20:35

1탄에서 networkx layout 함수를 사용했다. 

 

그래프 예쁘게 그리기! networkx layout 함수

그래프는 함수그리는 것과는 다르게, 노드의 위치가 정해져있지 않다. 그래서 간혹 그래프를 시각화하면 라벨이 겹쳐있거나, 분석하기에 어려운 면이 있다. networkx 에 유용한 함수가 있어서 정

zooyeonii.tistory.com

node classification 후에 node coloring을 하려고 하는데 제일 간단하게 할 수 있는 방법이 뭘까 찾아봤다. 
현재 karateclub data라서, 0과 33노드 기준으로 2개의 클래스로 나누는 문제이다. 

다음 코드처럼 딱 하나가 추가됐다. 현재 node_labels 는 prediction 결과로 torch.Size([34]) , x 는 torch.Size([34, 34]) 의 텐서이다. 

prediction 은 각 노드의 클래스가 적혀있고, x는 diagonal matrix의 모습이다. 이 상태로 그래프를 그릴 때, nx.draw 함수를 사용하였다. 

nx.draw 함수 
Parameters : 
G : graph
pos
ax : Matplotlib Axes object
node_size : scalar or array
node_color
font_size
등등... option이 다양하다. 자세한 내용 참고

def plot_graph(data, node_labels=None):
    fig, ax = plt.subplots()
    fig.set_tight_layout(False)
    nx_g = to_networkx(data=data).to_undirected()
    pos = nx.kamada_kawai_layout(nx_g)
    
    if node_labels is not None:
        node_color = [[1, 1, 0.5] if x else [1,0.5,0.5] for x in node_labels]
   
    nx.draw(nx_g, pos, with_labels=True, node_size = 200, node_color = node_color, font_size = 8)
    
    plt.show()

for ~ if ~ else 문을 한줄로 작성하기 

a   if   i>5   else   b   for  i   in list

for i in list : 
   if i>5 :
     list[i]=a
   else :
     list[i]=b

그래프 결과