Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีแสดงชื่อโหนดในกราฟ NetworkX ด้วย Matplotlib

Library NetworkX เป็นเครื่องมือยอดนิยมสำหรับสร้างและวิเคราะห์กราฟ/เครือข่าย (Graph/Network) ใน Python การแสดงชื่อโหนด (Node Labels) บนกราฟทำได้ง่ายด้วยพารามิเตอร์ with_labels=True ในฟังก์ชัน nx.draw()

ขั้นตอนการแสดงชื่อโหนด

  1. Import networkx และ matplotlib.pyplot
  2. สร้าง Graph Object (เช่น DiGraph สำหรับกราฟมีทิศทาง)
  3. เพิ่มโหนดและขอบ (Edges)
  4. ใช้ nx.draw(G, with_labels=True) เพื่อวาดพร้อมชื่อโหนด
  5. ปรับแต่ง Layout และสไตล์ตามต้องการ

ตัวอย่างโค้ดพื้นฐาน

import matplotlib.pyplot as plt
import networkx as nx

plt.rcParams["figure.figsize"] = [8, 6]
plt.rcParams["figure.autolayout"] = True

# สร้าง Directed Graph
G = nx.DiGraph()

# เพิ่มโหนดและขอบ
G.add_nodes_from([1, 2, 3, 4])
G.add_edges_from([(1, 2), (2, 1), (2, 3), (1, 4), (3, 4)])

# วาดกราฟพร้อมชื่อโหนด
nx.draw(G, 
        with_labels=True,           # แสดงชื่อโหนด
        node_color='lightblue',     # สีโหนด
        node_size=1500,             # ขนาดโหนด
        font_size=16,               # ขนาดฟอนต์ชื่อโหนด
        font_weight='bold',         # ตัวหนา
        arrowsize=20,               # ขนาดลูกศร (สำหรับ DiGraph)
        edge_color='gray',          # สีขอบ
        width=2)                    # ความหนาขอบ

plt.title("Directed Graph with Node Labels", fontsize=16, pad=20)
plt.show()

ตัวอย่างขั้นสูง: ปรับ Layout และสไตล์

import matplotlib.pyplot as plt
import networkx as nx

plt.rcParams["figure.figsize"] = [10, 8]
plt.rcParams["figure.autolayout"] = True

G = nx.Graph()  # Undirected Graph
G.add_edges_from([
    ("Bangkok", "Nonthaburi"), ("Bangkok", "Samut Prakan"),
    ("Bangkok", "Pathum Thani"), ("Bangkok", "Nakhon Pathom"),
    ("Nonthaburi", "Pathum Thani"), ("Samut Prakan", "Chachoengsao"),
    ("Pathum Thani", "Ayutthaya"), ("Nakhon Pathom", "Ratchaburi")
])

# ใช้ Layout ต่างๆ
pos = nx.spring_layout(G, k=2, iterations=50, seed=42)  # Force-directed
# pos = nx.circular_layout(G)  # วงกลม
# pos = nx.kamada_kawai_layout(G)  # สวยกว่า Spring

nx.draw_networkx_nodes(G, pos, node_color='lightcoral', node_size=2000, alpha=0.9)
nx.draw_networkx_edges(G, pos, edge_color='gray', width=2, alpha=0.6)
nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold', font_family='sans-serif')

plt.title("Network of Bangkok Metropolitan Provinces", fontsize=18, pad=20)
plt.axis('off')
plt.show()

ผลลัพธ์

กราฟแสดงโหนดพร้อมชื่อชัดเจน ใช้ Layout อัตโนมัติจัดตำแหน่งให้สวยงาม

คำแนะนำเพิ่มเติม

  • ใช้ nx.draw_networkx_* แยกแยะ (nodes, edges, labels) เพื่อควบคุมรายละเอียดมากขึ้น
  • Layout สำคัญมาก: spring_layout (default), kamada_kawai_layout (สวยกว่า), circular_layout, shell_layout
  • สำหรับกราฟใหญ่ ใช้ nx.draw_networkx_labels พร้อม font_size เล็กลง
  • ตั้งชื่อโหนดเป็นภาษาไทยได้โดยตรง (NetworkX รองรับ Unicode)