Eplot: แพ็กเกจใหม่สำหรับสร้างชาร์ตใน Emacs
(lars.ingebrigtsen.no)- eplot เป็นแพ็กเกจสำหรับวาดชาร์ตง่าย ๆ จากข้อมูลตัวเลขภายใน Emacs โดยเริ่มมาจากข้อจำกัดด้านการแสดงแกนและการใช้งานของ
chart.elรวมถึงชุด Org/Gnuplot - ประเด็นที่คิดหนักที่สุดคือ สเกลแกน Y ซึ่งต้องจัดการตัวเลขที่ดูดีในชุด 1·2·5 รวมถึงสเกลสุดขั้วและช่วงเวลาให้เป็นธรรมชาติ
- ผู้พัฒนานำประสบการณ์จากไลบรารีชาร์ต PHP เดิมมาย้ายเป็น Emacs Lisp และทำการแสดงผลอย่างกราเดียนต์บนฐาน SVG รวมถึงดาร์กโหมด แต่ตัดเอฟเฟกต์บางส่วนที่ต้องจัดการระดับพิกเซลออกไป
- เมื่อรัน
M-x eplotในบัฟเฟอร์ที่มีตัวเลขจำนวนมาก จะเปิดบัฟเฟอร์ชาร์ตขึ้นมา และสามารถเปลี่ยนการตั้งค่าด้วย headers กับC-c C-cเพื่อดูผลลัพธ์ได้อย่างรวดเร็ว - โค้ดเผยแพร่บน GitHub แล้ว แต่ยังเป็น โค้ดที่อยู่ระหว่างพัฒนา ซึ่งเขียนอย่างรวดเร็วโดยเน้นเทสต์เคสในช่วงหนึ่งสัปดาห์ จึงยังเหลืองานจัดระเบียบเส้นทางโค้ดและปรับปรุงความอ่านง่าย
เหตุผลที่อยากวาดชาร์ตได้โดยตรงใน Emacs
- หลังจากมองหาวิธีสร้างพล็อตง่าย ๆ มาเป็นเวลานาน ผู้เขียนได้ลองใช้
chart.elที่มีใน Emacs ตอนเขียนบทความเกี่ยวกับคะแนนภาพยนตร์ - แม้
chart.elจะรวมอยู่ใน Emacs แต่เดิมเป็นฟีเจอร์ที่เริ่มจากเครื่องมือทดสอบeieioจึงมีขอบเขตการใช้งาน ค่อนข้างจำกัด - งานที่ต้องการโดยรวมทำได้เป็นส่วนใหญ่ แต่โดยเฉพาะ การแสดงแกน Y ยังไม่น่าพอใจ
สเกลแกนที่กำหนดคุณภาพของชาร์ต
- การแสดงแกนที่แย่จะสังเกตเห็นได้ง่าย แต่การทำให้ดูเป็นธรรมชาติจริง ๆ ต้องจัดการกรณีขอบเขตต่าง ๆ อย่างรอบคอบ
- Google Finance ในอดีตก็เคยใช้ แกนที่ไม่เป็นธรรมชาติ โดยตั้งค่าที่มากที่สุดเป็นสเกลบนสุดของแกน Y แล้วเพิ่มเส้นที่มีระยะห่างเท่ากันลงไปทางจุดกำเนิด
- จำได้ว่าชาร์ตลักษณะนี้มีอยู่จนถึงราวปี 2021
- หลังจากนั้นเมื่อทำเว็บไซต์ใหม่ทั้งระบบ จึงได้แกนที่ดีกว่าเดิม
- ผู้เขียนมีประสบการณ์สร้าง chart library ขณะทำงานที่บริษัทนายหน้าซื้อขายหุ้นราวปี 1997
- ปัญหาเรื่องสเกลแกนไม่ใช่โจทย์คณิตศาสตร์ที่ยากเท่าไร แต่ใกล้เคียงกับการเลือกตัวเลขที่ดูดีและช่วงข้อยกเว้นอย่างละเอียดรอบคอบมากกว่า
- ตัวเลขที่ดูดีโดยทั่วไปคือหลายสเกลของ 1, 2, 5
- ในชาร์ตหุ้นอาจมีช่วงอย่าง
$0.00001~$0.00002หรือ1e9~1e10ได้ - แกนเวลาต้องพิจารณาตั้งแต่ปี ครึ่งปี ไตรมาส เดือน สัปดาห์ ไปจนถึงกรณีแบ่งเดือนเป็นหน่วยสัปดาห์
จุดที่ใช้เครื่องมือเดิมตรง ๆ ได้ยาก
- ไลบรารีชาร์ต PHP ที่เคยทำไว้นั้นสะดวกสำหรับสร้างผลลัพธ์บนเว็บเซิร์ฟเวอร์ แต่ไม่เหมาะกับการลองปรับตัวเลขและทดลองภายใน Emacs
- เช่นเดียวกับเหตุผลที่ Excel และ Jupyter Notebook ได้รับความนิยม กระบวนการ ปรับข้อมูลแบบอินเทอร์แอกทีฟ เพื่อเข้าใกล้ชาร์ตที่ต้องการนั้นสำคัญมาก
- Org ก็มีฟีเจอร์พล็อตเช่นกัน แต่ Org plot ใช้ Gnuplot เป็นแบ็กเอนด์
- แม้โดยรวม Gnuplot จะใช้งานได้ดี แต่เมื่อต้องเปลี่ยนค่าปริยาย เช่น รูปแบบตัวเลขบนแกน Y ในตัวอย่าง ภาระอาจเพิ่มขึ้นมาก
การพัฒนา eplot และฟีเจอร์ด้านการแสดงผล
- ชื่อ
chartถูกใช้อยู่แล้ว จึงตั้งชื่อแพ็กเกจใหม่ว่า eplot - เดิมไม่ได้ตั้งใจจะย้ายฟีเจอร์ทั้งหมดของไลบรารี PHP เดิมมา แต่เมื่อเริ่มพัฒนาแล้วก็ลงเอยด้วยการสร้างส่วนใหญ่ขึ้นมาใหม่
- เวอร์ชันใหม่นี้มีฟีเจอร์อย่าง ดาร์กโหมด ด้วย
- กราเดียนต์ในไลบรารี PHP เป็นวิธีที่เขียนด้วยมือ และเท่าที่จำได้ยังมีสิ่งอย่างทรัพยากรคัลเลอร์แมปของ GIF รวมอยู่ด้วย
- เวอร์ชัน Emacs Lisp ใช้ SVG
- เนื่องจาก SVG รองรับกราเดียนต์ จึงผสานโพลีกอนกับกราเดียนต์เพื่อสร้างเอฟเฟกต์คล้ายกัน
- สามารถได้ผลลัพธ์ใกล้เคียงกับต้นฉบับ PHP
- กราเดียนต์แปลก ๆ อีกแบบหนึ่งไม่ได้ถูกพัฒนา
- เพราะต้องทำในระดับพิกเซล หรืออย่างน้อยก็ระดับเส้น จึงทำได้ยาก
- อาจต้องใช้การคำนวณทางคณิตศาสตร์ จึงตัดออกไป
ขั้นตอนการใช้งานและวิธีตั้งค่า
- เมื่อรัน
M-x eplotในบัฟเฟอร์ที่มีตัวเลขจำนวนมาก ชาร์ตจะแสดงในบัฟเฟอร์แยกต่างหาก - เพื่อปรับชาร์ตให้เป็นรูปแบบที่ต้องการ จึงนำแนวคิด headers มาใช้
- ตัวเลือกที่มีประโยชน์ส่วนใหญ่ควบคุมได้ด้วย headers
- หลังเพิ่ม headers แล้วกด
C-c C-cก็ตรวจดูผลลัพธ์ได้ทันที - ยังมี eplot mode เพื่อให้ทำสิ่งนี้ได้ง่ายขึ้นด้วย
- หลังเพิ่ม headers แล้วกด
- ตัวอย่างง่าย ๆ แสดงในรูปแบบชาร์ตขนาดเล็ก และรูปแบบต่าง ๆ หลายแบบในภาพแรกของบทความก็ทำด้วย headers เป็นส่วนใหญ่
สถานะการเผยแพร่และงานที่เหลือ
- มีการเขียน
README.mdเพื่อบันทึกความเป็นไปได้ต่าง ๆ ไว้ - โค้ดเผยแพร่ที่ Microsoft Github
- สถานะปัจจุบันยังคงเป็น work in progress
- โดยพื้นฐานมองว่าน่าจะมีประโยชน์ได้ในระดับหนึ่ง แต่เนื่องจากเป็นสภาพที่เขียนและแก้ต่อเนื่องตลอดหนึ่งสัปดาห์ จึงยังฟันธงเรื่องเสถียรภาพได้ยาก
- โค้ดถูกเขียนแบบไม่มีประสิทธิภาพตามเทสต์เคสต่าง ๆ จึงอยู่ในสภาพที่ ต้องจัดระเบียบ
- ต้องรวมเส้นทางโค้ดหลายส่วนเข้าด้วยกัน
- ต้องเพิ่มความอ่านง่ายของโค้ด
- ตอนนี้ผู้เขียนพุชสถานะปัจจุบันเพื่อพักก่อน และผู้ใช้จริงยังต้องระมัดระวัง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ในฐานะคนที่ชอบงานด้านนี้ ขอเสริมคำแนะนำทั่วไปหน่อย ตอนก่อนหน้านี้เคยทำงานเป็นวิศวกรกับ Max Roser และ Hannah Ritchie ที่ Our World in Data บนไลบรารี Grapher (https://github.com/owid/owid-grapher) และได้เรียนรู้เยอะมากเกี่ยวกับการทำกราฟที่ดี
จากตัวอย่าง อยากแนะนำว่าอย่ามองข้าม ชื่อเรื่อง·ชื่อรอง·คำบรรยาย เลย คุณทำ “หัวข้อแบบเรียบง่าย” ไว้แล้ว ดังนั้นคงใส่ได้ไม่ยาก และข้อความสั้น ๆ ไม่กี่คำก็สร้างความต่างได้มาก ขอแนะนำ “Storytelling with Data” ของ Cole Nussbaumer Knaflic ด้วย
ถ้าพัฒนาต่อไปเรื่อย ๆ สักวันหนึ่งคงอยากใส่ ไลบรารี data flow และ DSL ด้วย dplyr ของ Hadley Wickham ใน R นั้นยอดเยี่ยมมาก และผมก็อ้างอิงแนวทางนั้นในเครื่องมือ Ohayo ของตัวเองกับไลบรารี CoreTable ของ OWID Grapher (https://github.com/owid/owid-grapher/tree/master/packages/%4...) เช่นกัน ไลบรารี Arquero ของ Jeffrey Heer ที่ค่อนข้างใหม่ (https://idl.uw.edu/arquero/) ก็อยู่ในสายคล้ายกัน
ช่วงนี้กำลังดูเครื่องมือใหม่ Plot ของ Mike Bostock (https://observablehq.com/plot/) อยู่ แม้จะเพิ่งลองได้แค่วันสองวันแต่ก็น่าคาดหวัง ตอนนี้ผมไม่ได้ใช้ Emacs แล้ว แต่หวังว่าสิ่งที่พูดมาจะเป็นประโยชน์
เช่น เวลากำลังสร้างไฟล์ข้อมูลอยู่ อาจไม่อยากมาแก้ด้วยมือก่อนวาดกราฟ หรือถ้ามีไดเรกทอรีที่เต็มไปด้วยไฟล์ข้อมูลขนาดใหญ่ ก็อาจอยากลองวาดตามต้องการโดยไม่ต้องใส่ header ให้แต่ละไฟล์ด้วยมือ
อย่างที่ต้นฉบับบอกไว้ มีโอกาสสูงว่าจะกลายเป็นกรณีที่ปริมาณโค้ดที่ต้องใช้มากกว่าการทำเองเสียอีก
ถ้าจะเปลี่ยนขนาด tick ขั้นที่สามของแกน Y ก็เหมือนต้องเรียกอะไรแบบ
set_third_level_y_ticks()ไม่ได้บอกว่ามันแย่เสมอไป หรือบางทีมันอาจต้องเป็นแบบนั้น แต่ความรู้สึกคือทุกอย่างดูเป็นกรณีพิเศษไปหมด ทำให้รู้สึกว่าขาด orthogonalityถึงอย่างนั้นก็ยังนับถือความพยายามที่จะสร้างอะไรสักอย่างด้วย elisp ล้วน
ที่สำคัญกราฟพวกนี้เป็น SVG จึงเอาไปใช้กับ LaTeX หรือเว็บเบราว์เซอร์ได้ด้วย อันแรกนี่เป็นตัวเลือกที่น่าสนใจมากเวลาต้องทำกราฟเพื่อแทรกในงานวิจัย ผลลัพธ์ดีมาก
ถึงอย่างนั้นตอนนี้ก็ดูเหมือน Codeberg กำลังเริ่มมีแรงส่งในหมู่โปรเจกต์เสรีและโอเพนซอร์สบ้างแล้วในที่สุด
เมื่อกี้ผมลองเปิดหน้าแรกของ github.com แล้วกด Ctrl-F หา “Microsoft” ผลคือ 0 รายการ