Tool: plot — สร้างกราฟที่ตัวอักษรไทยไม่บิดเบี้ยว ด้วยการ render ผ่าน CoreText

ภาพประกอบ: Tool: plot — สร้างกราฟที่ตัวอักษรไทยไม่บิดเบี้ยว ด้วยการ render ผ่าน CoreText

plot สร้างกราฟจากข้อมูลที่เตรียมไว้เพื่อให้เห็นแนวโน้มและความแตกต่างได้ทันที ใช้คู่กับการวิเคราะห์ข้อมูลเมื่อคำอธิบายเป็นตัวเลขอย่างเดียวอ่านยาก

Tool นี้คืออะไร

รับโค้ด Python ที่สร้างกราฟด้วย plt (matplotlib.pyplot), pd (pandas), np (numpy) ที่ pre-import ไว้ให้แล้ว — โมเดลไม่ต้อง import matplotlib เอง ไม่ต้องเรียก savefig เอง tool จัดการบันทึกเป็น PNG และเปิดใน viewer ให้อัตโนมัติ (ผ่านคำสั่ง open ของ macOS)

ปัญหาที่แก้: matplotlib วาดข้อความไทยลอยผิดที่

นี่คือปัญหาจริงที่ทีมพัฒนาพบและแก้ด้วยวิธีที่ซับซ้อนกว่าที่คาดคิด: matplotlib ใช้ font renderer ของตัวเอง (ไม่ใช่ระบบ) ซึ่งจัดตำแหน่ง combining mark ของภาษาไทย (สระบน-ล่าง, วรรณยุกต์) ผิดพลาด — ตัวอักษรไทยที่มีวรรณยุกต์ซ้อนสระ (เช่น “ก่อน”, “น้ำ”) มักจะวาดออกมาลอยผิดตำแหน่งหรือทับกันไม่สวย ปัญหานี้เกิดกับ font renderer แบบ cross-platform ทั่วไปที่ไม่ได้ปรับแต่งสำหรับ layout ภาษาไทยโดยเฉพาะ

ทางแก้: render ข้อความไทยแยกผ่าน CoreText แล้ว paste ทับ

วิธีแก้ที่ใช้จริงมีหลายขั้นตอนซับซ้อน:

  1. ให้ matplotlib วาดกราฟตามปกติก่อน โดยตั้ง font เป็น Thonburi (หรือ Noto Sans Thai/Garuda/Norasi ถ้ามี) เพื่อให้ layout/spacing ถูกต้อง (ตำแหน่งที่ข้อความควรอยู่คำนวณถูก แม้ตัวอักษรจะ render ผิดรูปก็ตาม)
  2. หาตำแหน่ง (bounding box) ของข้อความไทยทุกจุดในกราฟ (title, axis label, tick label) จาก renderer ของ matplotlib เอง แล้วทำให้ข้อความเหล่านั้นโปร่งใส (set_color("none")) ก่อน save เป็นภาพ — ผลคือได้กราฟที่มีช่องว่างตรงตำแหน่งที่ข้อความไทยควรอยู่ แต่ยังไม่มีตัวอักษรแสดง
  3. Render ข้อความไทยแต่ละชิ้นแยกต่างหากผ่าน macOS CoreText (Quartz/CoreText/AppKit — API ระดับ OS ที่ macOS ใช้ render ตัวอักษรในแอประบบทั้งหมด รู้จัก combining mark ภาษาไทยถูกต้อง) เป็นภาพ PNG โปร่งใสแยกชิ้น โดยrender ที่ความละเอียดสูงกว่าเป้าหมาย 3 เท่าแล้วค่อยย่อลง (oversample) เพื่อให้ anti-alias คมชัด
  4. วาง (paste) ภาพข้อความที่ render ถูกต้องแล้วทับลงตำแหน่งเดิม ที่คำนวณไว้จากขั้นตอนที่ 2

ผลลัพธ์คือกราฟที่มีตำแหน่งจัดวางถูกต้องตาม layout ของ matplotlib แต่ตัวอักษรไทยคมชัดถูกต้องตามที่ CoreText render — ผสานจุดแข็งของทั้งสองระบบเข้าด้วยกัน

Fallback: ไม่มีข้อความไทยก็ไม่ต้องทำอะไรพิเศษ

ถ้ากราฟไม่มีข้อความไทยเลย (เช่นกราฟที่ label เป็นภาษาอังกฤษ/ตัวเลขล้วน) ระบบข้ามขั้นตอนซับซ้อนทั้งหมดไปเลย ใช้ fig.savefig() ตรงๆ ตามปกติ — ไม่เสียเวลาและความซับซ้อนเพิ่มโดยไม่จำเป็นเมื่อปัญหาที่ต้องแก้ไม่ได้เกิดขึ้นจริงในกราฟนั้น

จำกัด scope ไว้ที่การวิเคราะห์+วาดกราฟ ให้โมเดลเขียนโค้ดจริง

คอมเมนต์ต้นไฟล์ระบุ scope ชัดเจน: “data analysis + matplotlib plots — agent เขียน code เอง (27B ทำได้)” หมายความว่า tool นี้ไว้ใจให้โมเดลเขียนโค้ดจริงไม่ใช่แค่เลือก template สำเร็จรูป — สอดคล้องกับปรัชญาของ TH ที่ใช้โมเดลใหญ่พอจะเขียนโค้ดที่ถูกต้องได้เอง (ต่างจาก AGENT LITE ที่ไม่มี tool สร้างกราฟเลยเพราะโมเดล 2B เขียนโค้ดวิเคราะห์ข้อมูลซับซ้อนแบบนี้ไม่ไหว)

ทำไมเรื่องนี้ถึงสำคัญ

plot เป็นตัวอย่างที่ดีของปัญหาที่ดูเหมือนเล็กน้อย (ข้อความไทยในกราฟ) แต่ต้องแก้ด้วยวิธีที่ลึกถึงระดับ font rendering pipeline — การแก้ปัญหานี้ไม่ใช่แค่ “เลือก font ที่ถูกต้อง” เพราะปัญหาไม่ได้อยู่ที่ font แต่อยู่ที่ ตัว renderer ของ matplotlib เองที่ไม่รองรับ combining mark ภาษาไทยถูกต้อง — การแก้ตรงจุดต้องอาศัย API ระดับ OS (CoreText) ที่ทำ layout ภาษาไทยถูกอยู่แล้ว มาช่วยเฉพาะส่วนที่ matplotlib ทำไม่ได้

อ่านเพิ่มเติม

ความคิดเห็น

กำลังโหลดความคิดเห็น...