สร้าง Flowchart ด้วย Python อย่างมืออาชีพ
เปลี่ยนคู่มือ `graphviz` ที่ซับซ้อนให้เป็นประสบการณ์การเรียนรู้ที่โต้ตอบได้ สำรวจแนวคิดต่างๆ ตั้งแต่พื้นฐานจนถึงขั้นสูงผ่านตัวอย่างที่คุณสามารถโต้ตอบได้
1. แนวคิดพื้นฐาน (The Basics)
ในการใช้งาน Graphviz คุณต้องเข้าใจว่ามันประกอบด้วย 2 ส่วนที่ทำงานร่วมกัน: ซอฟต์แวร์ระบบ (Engine) ที่ทำหน้าที่เรนเดอร์ภาพ และ ไลบรารี Python (Interface) ที่เราใช้เขียนโค้ดเพื่อสร้างคำสั่ง การติดตั้งจึงต้องทำทั้งสองส่วน
ส่วนที่ 1: ติดตั้ง Engine
ติดตั้งลงบนระบบปฏิบัติการของคุณโดยตรง
# macOS (Homebrew)
brew install graphviz
# Ubuntu/Debian
sudo apt-get install graphviz
# Windows
ดาวน์โหลดจากเว็บทางการและอย่าลืม Add to PATH
ส่วนที่ 2: ติดตั้งไลบรารี Python
หลังจากติดตั้ง Engine แล้ว ให้ติดตั้งไลบรารีผ่าน pip
การเริ่มต้นใช้งาน
Import คลาส `Digraph` (Directed Graph) สำหรับ Flowchart
2. ส่วนประกอบหลัก: โหนดและเส้นเชื่อม
การกำหนดโหนด (Define nodes)
โหนดคือขั้นตอนในกระบวนการ สร้างด้วยเมธอด `dot.node()` โดยมี `name` (ID ในโค้ด) และ `label` (ข้อความที่แสดงผล)
การกำหนดเส้นเชื่อม (Define edges)
เส้นเชื่อมแสดงทิศทางการไหลของกระบวนการ สร้างด้วย `dot.edge()` โดยระบุ `name` ของโหนดต้นทางและปลายทาง
3. สไตล์และสัญลักษณ์มาตรฐาน
Flowchart ที่ดีใช้สัญลักษณ์ที่เป็นมาตรฐานสากลเพื่อสื่อความหมาย เราสามารถกำหนดรูปทรงของโหนดได้ด้วยแอตทริบิวต์ `shape`
Terminator
จุดเริ่มต้น/สิ้นสุดของกระบวนการ
Process
ขั้นตอนการทำงานหรือการประมวลผล
Decision
จุดตัดสินใจหรือการแตกแขนง
Data (I/O)
การรับหรือแสดงผลข้อมูล
Predefined Process
อ้างอิงถึงกระบวนการย่อยที่กำหนดไว้แล้ว
4. การสร้างเงื่อนไขและการแตกแขนง
หัวใจของ Flowchart คือการแสดงตรรกะและเงื่อนไข เราใช้โหนดรูปสี่เหลี่ยมข้าวหลามตัด (`shape='diamond'`) สำหรับการตัดสินใจ และใช้ `label` บนเส้นเชื่อม (`edge`) เพื่อแสดงผลลัพธ์ของเงื่อนไขนั้นๆ
dot.node('proc_yes', 'ประมวลผลต่อ')
dot.node('proc_no', 'แจ้งข้อผิดพลาด')
dot.edge('check', 'proc_yes', label='ใช่')
dot.edge('check', 'proc_no', label='ไม่ใช่')
↓ ใช่
↓ ไม่ใช่
5. โครงสร้างขั้นสูง: การจัดกลุ่มด้วย Cluster
เมื่อ Flowchart ซับซ้อนขึ้น เราสามารถใช้ `subgraph` ที่มีชื่อขึ้นต้นด้วย `cluster_` เพื่อวาดกรอบล้อมรอบกลุ่มของโหนดที่เกี่ยวข้องกัน ทำให้แผนภาพดูเป็นระเบียบและเข้าใจง่ายขึ้น
with g.subgraph(name='cluster_frontend') as c:
c.attr(label='ส่วน Frontend')
c.node('React')
with g.subgraph(name='cluster_backend') as c:
c.attr(label='ส่วน Backend')
c.node('API')
g.edge('React', 'API')
ส่วน Frontend
ส่วน Backend
6. ตัวอย่างสมบูรณ์: ผังกระบวนการอนุมัติเอกสาร
นำทุกแนวคิดมารวมกันเพื่อสร้าง Flowchart ที่สมบูรณ์แบบสำหรับกระบวนการอนุมัติเอกสาร ประกอบด้วยการจัดกลุ่มด้วย `cluster` และการตัดสินใจแบบวนลูป
ลองเอาเมาส์ไปวางบนโหนดหรือเส้นเชื่อมในแผนภาพเพื่อไฮไลท์โค้ดที่เกี่ยวข้อง
from graphviz import Digraph
df = Digraph('doc_approval')
df.attr(rankdir='TB', splines='ortho')
df.attr('node', shape='box', style='rounded')
df.node('start', 'Start', shape='ellipse')
with df.subgraph(name='cluster_preparation') as prep:
prep.attr(label='Phase 1: Preparation',
style='filled', color='lightgrey')
prep.node('create_doc', 'Create Document')
prep.node('review_peer', 'Peer Review')
with df.subgraph(name='cluster_approval') as approval:
approval.attr(label='Phase 2: Approval',
style='filled', color='lightblue')
approval.node('submit_mgr', 'Submit to Manager')
approval.node('decision_mgr', 'Manager Approve?',
shape='diamond')
approval.node('revise_doc', 'Revise Document')
approval.node('approved', 'Document Approved',
fillcolor='lightgreen')
df.node('end', 'End', shape='ellipse')
df.edge('start', 'create_doc')
df.edge('create_doc', 'review_peer')
df.edge('review_peer', 'submit_mgr')
df.edge('submit_mgr', 'decision_mgr')
df.edge('decision_mgr', 'approved', xlabel='Yes')
df.edge('decision_mgr', 'revise_doc', xlabel='No')
df.edge('revise_doc', 'submit_mgr')
df.edge('approved', 'end')
7. การสร้างไฟล์ภาพ (Render Image)
หลังจากสร้างโครงสร้าง Flowchart ทั้งหมดแล้ว ขั้นตอนสุดท้ายคือการใช้เมธอด `.render()` เพื่อสั่งให้ Graphviz สร้างไฟล์ภาพจริงๆ ขึ้นมา เมธอดนี้จะแปลงโค้ด Python ของคุณให้เป็นภาษา DOT แล้วส่งไปให้ Engine ของ Graphviz ทำการวาดภาพ
- `'document_flow'`: คือชื่อไฟล์ผลลัพธ์ (ไม่ต้องใส่นามสกุล)
- `directory='output'`: (ตัวเลือก) ระบุโฟลเดอร์ที่จะบันทึกไฟล์ หากไม่ระบุจะบันทึกที่เดียวกับไฟล์ Python
- `view=True`: (ตัวเลือก) หากเป็น `True` โปรแกรมจะพยายามเปิดไฟล์ภาพให้ดูโดยอัตโนมัติหลังสร้างเสร็จ
- `format='png'`: (ตัวเลือก) กำหนดรูปแบบไฟล์ที่ต้องการ เช่น `png`, `svg`, `pdf` หรือ `jpg`
ตัวอย่างภาพที่ได้จากการ Render