สร้าง 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

pip install graphviz

การเริ่มต้นใช้งาน

Import คลาส `Digraph` (Directed Graph) สำหรับ Flowchart

from graphviz import Digraph # สร้างอ็อบเจกต์ Digraph dot = Digraph(comment='My Flowchart')

2. ส่วนประกอบหลัก: โหนดและเส้นเชื่อม

การกำหนดโหนด (Define nodes)

โหนดคือขั้นตอนในกระบวนการ สร้างด้วยเมธอด `dot.node()` โดยมี `name` (ID ในโค้ด) และ `label` (ข้อความที่แสดงผล)

dot.node('step1', 'รวบรวมข้อมูล')
รวบรวมข้อมูล

การกำหนดเส้นเชื่อม (Define edges)

เส้นเชื่อมแสดงทิศทางการไหลของกระบวนการ สร้างด้วย `dot.edge()` โดยระบุ `name` ของโหนดต้นทางและปลายทาง

dot.edge('step1', 'step2')
Step 1
Step 2

3. สไตล์และสัญลักษณ์มาตรฐาน

Flowchart ที่ดีใช้สัญลักษณ์ที่เป็นมาตรฐานสากลเพื่อสื่อความหมาย เราสามารถกำหนดรูปทรงของโหนดได้ด้วยแอตทริบิวต์ `shape`

Terminator

จุดเริ่มต้น/สิ้นสุดของกระบวนการ

Start / End
dot.node('id', 'Start', shape='ellipse')
Process

ขั้นตอนการทำงานหรือการประมวลผล

Process Step
dot.node('id', 'Label', shape='box')
Decision

จุดตัดสินใจหรือการแตกแขนง

Is Valid?
dot.node('id', 'Question?', shape='diamond')
Data (I/O)

การรับหรือแสดงผลข้อมูล

Input Data
dot.node('id', 'Data', shape='parallelogram')
Predefined Process

อ้างอิงถึงกระบวนการย่อยที่กำหนดไว้แล้ว

Run Subroutine
dot.node('id', 'Sub', shape='box', style='rounded')

4. การสร้างเงื่อนไขและการแตกแขนง

หัวใจของ Flowchart คือการแสดงตรรกะและเงื่อนไข เราใช้โหนดรูปสี่เหลี่ยมข้าวหลามตัด (`shape='diamond'`) สำหรับการตัดสินใจ และใช้ `label` บนเส้นเชื่อม (`edge`) เพื่อแสดงผลลัพธ์ของเงื่อนไขนั้นๆ

dot.node('check', 'ข้อมูลถูกต้อง?', shape='diamond')
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

React

ส่วน Backend

API

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')
Start
Phase 1: Preparation
Create Document
Peer Review
Phase 2: Approval
Submit to Manager
Manager Approve?
Revise Document
Document Approved
End
Yes
No

7. การสร้างไฟล์ภาพ (Render Image)

หลังจากสร้างโครงสร้าง Flowchart ทั้งหมดแล้ว ขั้นตอนสุดท้ายคือการใช้เมธอด `.render()` เพื่อสั่งให้ Graphviz สร้างไฟล์ภาพจริงๆ ขึ้นมา เมธอดนี้จะแปลงโค้ด Python ของคุณให้เป็นภาษา DOT แล้วส่งไปให้ Engine ของ Graphviz ทำการวาดภาพ

# สมมติว่า df คืออ็อบเจกต์ Digraph ของคุณ df.render('document_flow', directory='output', view=True, format='png')
  • `'document_flow'`: คือชื่อไฟล์ผลลัพธ์ (ไม่ต้องใส่นามสกุล)
  • `directory='output'`: (ตัวเลือก) ระบุโฟลเดอร์ที่จะบันทึกไฟล์ หากไม่ระบุจะบันทึกที่เดียวกับไฟล์ Python
  • `view=True`: (ตัวเลือก) หากเป็น `True` โปรแกรมจะพยายามเปิดไฟล์ภาพให้ดูโดยอัตโนมัติหลังสร้างเสร็จ
  • `format='png'`: (ตัวเลือก) กำหนดรูปแบบไฟล์ที่ต้องการ เช่น `png`, `svg`, `pdf` หรือ `jpg`

ตัวอย่างภาพที่ได้จากการ Render

ตัวอย่าง Flowchart ที่ render แล้ว