최근에 graph가 필요한 일이 있어서 써먹은 김에 정리해서 공유드립니다.
요기서 말하는 그래프는 알고리즘 공부를 하셨다면 마지막쯤에 보셨을 바로 그 그래프입니다. ㅎㅎ
Create Undirected Graph
먼저 무지향성 그래프를 만들어보겠습니다.
이미 아시는 바와 같이 node 사이의 edge에 방향성이 없는 그래프입니다.
먼저, 간단하게 도와줄 모듈을 설치합니다.
$ pip install networkx
해당 모듈을 사용하여 그래프를 만드는 것은 매우 쉽습니다.
import networkx as nx
my_graph = nx.Graph()
이게 끝이에요. ㅎㅎ
이제 간단히 노드 3개를 추가하고 2:1로 연결을 해줄게요.
my_graph.add_node('A')
my_graph.add_node('B')
my_graph.add_node('C')
my_graph.add_edge('A', 'C')
my_graph.add_edge('B', 'C')
Method 이름만 봐도 쉽게 유추가 가능하죠?
마지막으로 설정한 정보를 출력해볼게요.
print(my_graph.number_of_nodes()) # 3
print(my_graph.nodes) # ['A', 'B', 'C']
print(my_graph.number_of_edges()) # 2
print(my_graph.edges) # [('A', 'C'), ('B', 'C')]
Created Directed Graph
지향성 그래프는 edge에 방향이 있는 그래프 입니다.
이것 역시 거의 동일한 방법으로 쉽게 만들 수 있어요.
my_graph = nx.DiGraph()
Class만 DiGraph로 바꿔주시면 바로 동일하게 만드실 수 있어요.
단, add_edge() method의 parameter가 (from, to)로 들어가게 된다는 것만 알아두시면 됩니다.
여러 개의 nodes 혹은 edges를 iterable을 사용하여 한 번에 넣어줄 수도 있습니다.
이 방법으로 위의 예제를 좀 더 간단하게 변경해 볼게요.
my_graph.add_nodes_from(["A", "B", "C"])
my_graph.add_edges_from([("A", "C"), ("B", "C")])
모든 nodes와 edges를 각각 한 줄로 만들어줬어요.
Draw Graph using Matplotlib
각종 그래프 및 차트를 그릴 때, 가장 많이 사용되는 matplotlib을 사용해서 그려보겠습니다.
먼저 필요한 모듈을 설치해줍니다.
$ pip install matplotlib
그리는 건 아주 간단해요.
import matplotlib.pyplot as plt
nx.draw(my_graph, with_labels=True)
plt.show()
지향성 그래프가 잘 그려졌죠?
원하는대로 꾸며줄 수도 있습니다.
nx.draw(my_graph, with_labels=True, node_color="red", edge_color="blue", node_size=200)
Draw Graph on Tkinter
마지막으로 tkinter를 이용하여, desktop application에 그래프를 그려보겠습니다.
canvas를 이용하면 쉽게 그려줄 수 있어요.
import tkinter as tk
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
my_graph = nx.DiGraph()
my_graph.add_nodes_from(["A", "B", "C"])
my_graph.add_edges_from([("A", "C"), ("B", "C")])
root = tk.Tk()
fig = plt.Figure()
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
nx.draw(my_graph, with_labels=True, ax=fig.add_subplot(111))
tk.mainloop()
주의할 점은 canvas를 먼저 준비한 후에, draw를 해주셔야 합니다.
몇 줄 안되는 코드로 간단히 그려줄 수 있습니다. ^^
Wrap Up
이번에는 그래프 이론을 적용해서 실제 그려주는 것에 대해 살펴보았습니다.
제가 소개해드린 내용 외로 edge에 weight를 준다던지 하는 것들도 아주 쉽게 가능하니 필요한 분들은 응용해보세요.
'Python' 카테고리의 다른 글
[FastAPI] Getting Started (0) | 2023.09.13 |
---|---|
[PyQt6] Save and Load Settings using QSettings (0) | 2023.04.06 |
[Python] Abstract Base Classes (0) | 2023.02.23 |
[Python] Enumeration (0) | 2023.02.21 |
[Python] Data Classes (0) | 2023.02.20 |
댓글