본문 바로가기
Python

[Python] Create and Draw Graph

by llHoYall 2023. 3. 1.

최근에 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

댓글