networkx는 python으로 Graph(Node-Edge)를 표현할 수 있는 대표적인 패키지다.
이쁘기는 GraphViz도 있는데 범용성으로 보면 networkx가 더 나은 것 같다.( 추후, networkx와 Graphviz를 함께 사용할 수 있는 방법도 정리하겠다.)
networkx의 기본적인 사용법은 다른곳에서도 많이 정리해 뒀기 때문에 따로 깊이 다루지 않겠지만, 기본적으로 다음과 같은 코드로 간단한 그래프를 그릴 수 있다. 이 외에 방향성 그래프나 시각효과 등 부가적인 함수들은 상단에 언급한 공식 networkx 홈페이지를 보면 참고할 수 있다.
import networkx as nx
import matplotlib.pyplot as plt
# 그래프 객체 선언
G = nx.Graph()
# 노드 생성
G.add_node("nodeA")
G.add_node("nodeC")
# 엣지 생성
G.add_edge("nodeA", "nodeC")
# 그림 그리기
nx.draw(G, with_labels=True,font_family=font_name)
#그림 저장
plt.savefig("Graph.png", format="PNG")
# 시각화(in Jupyter notebook)
plt.show()
앞에서 봤다시피 networkx는 직관적이고 간단한 코드로 그래프를 그릴 수 있는데, 여기서 한글을 사용할 때 깨지는 문제가 생긴다. 이는 matplotlib에서 발생하는 문제로, matplotlib에서 한글을 사용할 때는 다음과 같이 font_manager나 fc등을 선언해서 한글을 입력할 수 있다.
이때, font 경로가 중요한데 나같은 경우엔 기본적으로 나눔바른고딕폰트파일을 갖고 있었다. 따라서, 그냥 내가 갖고 있는 font의 path를 넣어줘도 되고, 아래와 같은 명령어로 나눔고딕 폰트를 별도로 설치해줘도 된다. (나같은 경우엔 그냥 네이버 같은 곳에서 ttf파일 별도로 다운받아 코드가 있는 폴더에 넣는것을 추천한다)
apt-get install fonts-nanum*
(만약 상단 명령어로 설치했다면, Ubuntu를 기준으로 "usr/share/fonts/truetype/nanum/" 이곳에 있을수도 있고, 아나콘다 환경을 사용한다면 "/opt/conda/envs/"안에서 찾아볼 수도 있겠다)
아무튼 최대한 실물 폰트 ttf파일의 경로를 찾아서 fname 뒤에 명시해주면 된다.
import matplotlib.font_manager as fm
from matplotlib import rc
font_name = fm.FontProperties(fname="NanumBarunGothic.ttf").get_name()
rc('font', family=font_name)
plt.title("Test입니다.")
근데 간혹, 이렇게 했는데도 한글이 안나오는 경우가 있다. 이럴땐 캐시를 삭제해주자. 웹 브라우저에서 캐시나 쿠키 데이터 삭제하듯이, 아래 명령어로 캐시를 삭제해주고 나면 한글이 정상적으로 나올것이다.
rm ~/.cache/matplotlib -rf
여기에 +알파로 이전에 보여준, 그래프 상 노드에 한글이 있는 경우는 아래와 같이 nx.draw함수에 font_family를 명시해주면 된다.
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm
from matplotlib import rc
import os
font_name = fm.FontProperties(fname="NanumBarunGothic.ttf").get_name()
rc('font', family=font_name)
G = nx.Graph()
# 노드 설정
G.add_node("nodeA")
G.add_node("노드B")
G.add_node("nodeC")
G.add_node("노드A")
G.add_edge("노드A", "노드B")
G.add_edge("nodeA", "nodeB")
G.add_edge("nodeA", "nodeC")
G.add_edge("nodeB", "nodeC")
pos = nx.random_layout(G)
"""
nx.spring_layout(G),
nx.spectral_layout(G),
nx.shell_layout(G),
nx.circular_layout(G),
nx.kamada_kawai_layout(G),
nx.random_layout(G)
"""
#좌표 설정
plt.title("그래프 예제")
nx.draw(G, pos, with_labels=True, font_family=font_name)
plt.show()
여기서 pos에 nx.random_layout이 사용됐는데, nx에서 제공하고 있는 layout함수는 하단 주석처럼 여러 가지가 있으니깐 직접 써보고 원하는 레이아웃으로 선택하면된다.
'머신러닝 > Computer Vision' 카테고리의 다른 글
[PIL / colorthief / extcolors] 이미지 내 주요 색 추출 (Extracting dominant colors in image python) (0) | 2022.11.14 |
---|---|
[python/cv2] RGB colour table/ rgb 컬러 triplet (0) | 2022.10.31 |
OCR bounding box 좌표값으로 정렬하기 (ocr bbox sorting by coordinate) left to right / top to down (0) | 2022.05.20 |
[OpenCV] 이미지 내 특정 컬러 변경(글자 색 바꾸기) (0) | 2022.04.12 |
[OpenCV] 이미지 내 글자 탐지, 글자 삭제(배경 컬러로 합성) (0) | 2022.04.12 |