วิเคราะห์เชิงลึก D3
(d3indepth.com)- D3 in Depth เป็นสื่อการเรียนรู้ที่อ้างอิง D3 6 และ 7 โดยครอบคลุมกระบวนการสร้างการแสดงผลข้อมูลแบบกำหนดเองด้วย D3.js
- เน้นที่ การสร้างงานแสดงผลแบบกำหนดเอง มากกว่าการใช้งานกราฟแบบพื้นฐาน และช่วยให้เรียนรู้องค์ประกอบของการทำเว็บวิชวลไลเซชันไปพร้อมกัน
- พื้นฐานของ HTML, SVG, CSS และ JavaScript เชื่อมโยงกับการทำงานของ D3 จึงช่วยให้เข้าใจ การนำเสนอข้อมูลบนเว็บ ได้ดียิ่งขึ้น
- ยังต่อยอดไปยังเนื้อหาเกี่ยวกับแดชบอร์ดและ data story ที่ใช้ React, Chart.js และ Leaflet ทำให้สามารถสร้าง เส้นทางการเรียนรู้ด้าน JavaScript visualization ได้
- สำหรับผู้อ่านที่ต้องการเรียนรู้ D3 อย่างลึกซึ้ง สามารถใช้เป็นสื่อทั้งระดับเริ่มต้นและต่อยอดที่พาควบคู่กันไปทั้งความเข้าใจเชิงแนวคิดและการลงมือปฏิบัติ
ขอบเขตที่ D3 in Depth ครอบคลุม
- D3 in Depth ครอบคลุม D3 เวอร์ชัน 6 และ 7
- สามารถเรียนรู้วิธีสร้าง การแสดงผลข้อมูลแบบกำหนดเอง ด้วย D3.js
- ครอบคลุม HTML, SVG, CSS และ JavaScript ซึ่งเป็นองค์ประกอบพื้นฐานที่จำเป็นต่อการสร้างวิชวลไลเซชันบนเว็บ
แหล่งเรียนรู้ JavaScript visualization ที่ควรดูร่วมกัน
- Data Dashboards with JavaScript ว่าด้วยวิธีสร้างแดชบอร์ดข้อมูลด้วย React, Chart.js และ Leaflet
- Visualising Data with JavaScript ว่าด้วยวิธีสร้างกราฟและ data story ด้วย Chart.js, Leaflet, D3 และ React
- มีผู้อ่านรายหนึ่งประเมินว่าสื่อนี้เป็นหนึ่งในหนังสือ D3 ที่โดดเด่น โดยมองว่าเนื้อหาชัดเจน ทำตามได้ง่าย และวางพื้นฐานแนวคิดได้แข็งแรง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เป็นไลบรารีที่เพิ่มแนวปฏิบัติและฟังก์ชันอำนวยความสะดวกจำนวนมากสำหรับสร้างกราฟ แผนภูมิ และพล็อตบน D3
นอกจากนี้ยังมี Observable Framework[2] ซึ่งเป็นตัวสร้างไซต์แบบสแตติกสำหรับแดชบอร์ดการแสดงผล ที่รองรับ Plot, D3 และไลบรารีอื่น ๆ อีกหลายตัว
1: https://observablehq.com/plot/
2: https://observablehq.com/framework/
สำหรับพล็อตหลายประเภท การจัดการ ข้อมูล SVG โดยตรงมักจะง่ายกว่าในทางปฏิบัติ และก็ไม่ได้ยากขนาดนั้น
อยากให้มีไลบรารีหรือเฟรมเวิร์กที่ช่วยให้จัดการเอาต์พุต SVG หรือ canvas ได้ง่ายขึ้น การแก้ไขเล็ก ๆ ควรทำได้ง่ายมาก แต่ยิ่งเฟรมเวิร์กเป็นระดับสูงเท่าไร ก็ยิ่งออกนอกเส้นทางที่กำหนดไว้ได้ยากขึ้นเท่านั้น
เอกสารก็ถือว่าค่อนข้างดี แต่ไม่มีส่วน API reference ที่ใช้งานได้จริง เลยไม่ค่อยดีนักสำหรับการค้นหาฟีเจอร์ต่าง ๆ
พยายามหลีกเลี่ยงการสร้างกราฟด้วย HTML5 canvas ให้มากที่สุด เลยอยากได้แนวทางที่ออกแบบใหม่ ๆ
แก้ไข: พอเปิด hardware acceleration แล้วลื่นขึ้น แต่แม้บน Ryzen 9 ก็ยังคงกระตุกกว่าที่คาด
ถ้าให้แก้สมการเชิงอนุพันธ์ย่อยที่ไม่ได้ดูมา 10 ปี น่าจะเรียกความรู้สึกกลับมาได้เร็วกว่าด้วยซ้ำ
เอกสารอ้างอิงของ D3 ก็คิดว่าแย่มากจริง ๆ
ถึงอย่างนั้นตอนนี้ดูเหมือนจะเสถียรมากขึ้นแล้ว พอเริ่มเขียนด้วย Svelte+D3 ใน สไตล์เชิงคำสั่ง มากกว่าการใช้ D3 เพียงอย่างเดียว ก็เริ่มจับทางได้
เข้าใจองค์ประกอบที่ถูกสร้างขึ้นได้ง่ายกว่า แทนที่จะค่อยไปส่ององค์ประกอบที่สร้างแล้วใน developer tools ภายหลัง
เว็บไซต์นี้ช่วยได้สำหรับการใช้ D3 ร่วมกับ Svelte: https://svelte.recipes/
งานของผม 80% เป็นแอปพลิเคชัน, 10% เป็นระบบ, 10% เป็นการวิเคราะห์ข้อมูล และบางครั้งก็ทำ Jupyter notebook อยู่ 2 สัปดาห์แล้วไม่ได้แตะอีกสองเดือน
ไลบรารีพล็อตส่วนใหญ่มี नियमตามอำเภอใจที่ต้องจำเยอะ และมักมี ภาษาเฉพาะโดเมน เล็ก ๆ หลายชุด ประมาณว่าสตริงธรรมดาถูกตีความซับซ้อนกว่า
atoiมากอีกทั้งในหลายด้าน เช่น การกำหนดช่วงของแกน การจัดการจุดจำนวนมหาศาล ก็มีบางอย่างที่จากมุมมองของผมดูผิดปกติ
D3 บังคับให้ทำหลายอย่างเองก็จริง แต่อินเทอร์เฟซสำหรับสิ่งเหล่านั้นเข้าใจได้เป็นธรรมชาติในเชิงแนวคิด ผมมองว่าการทำให้ถูกต้องด้วย D3.js ดีกว่าการใช้โค้ดเอนกประสงค์ที่อ้วนเทอะทะและบั๊กเยอะของคนอื่นผ่าน API ที่ให้ความรู้สึกเหมือนต่อเรือในขวด
ใช้ผิดได้ง่าย ดีบักยาก และเข้าใจยาก
ไม่ได้หมายความว่าปัญหานี้แก้ได้ง่าย ๆ หากต้องทำกราฟิกที่ขับเคลื่อนด้วยข้อมูลแบบเฉพาะเจาะจงมาก ๆ ก็คงยังมีโอกาสสูงที่จะเลือก D3 อยู่ดี
การเอา API ไปเทียบกับมาตรฐานแบบนั้น ดูแล้วไม่ค่อยยุติธรรมเท่าไร
ควรหลีกเลี่ยงโค้ดที่แม้แต่ผู้เขียนเองก็ยังเข้าใจได้ยากให้มากที่สุด และ D3 ก็เป็นตัวอย่างเด่นของไลบรารีแบบนั้น
ตัวอย่างเช่น ถ้าจะวาดข้อมูลช่วง 0–100 คะแนนบนหน้าจอ 1080p ขนาด 1920x1080 สักช่วงหนึ่งก็ต้องตัดสินใจว่าจะ สเกล ข้อมูลให้เข้ากับการฉายลงหน้าจออย่างไร
จะคำนวณคณิตศาสตร์เองก็ได้ หรือจะให้ไลบรารีอย่าง D3 คำนวณให้ก็ได้
ต่อให้ไม่ได้วาดข้อมูลบนเว็บ สักวันหนึ่งก็ต้องมีงานวาดข้อมูลลงที่ใดที่หนึ่ง และจะได้มองหาเครื่องมือที่ทำหน้าที่เดียวกันในระบบนิเวศนั้น ซึ่งจะมีประโยชน์
จำได้ว่าต้องสเกลสี่เหลี่ยมที่จะวาดในกราฟให้เข้ากับขนาด PNG ที่กำลังสร้าง
แน่นอนว่ามันเป็นเรื่องเล็กมาก และแตกต่างอย่างสิ้นเชิงจากสิ่งน่าทึ่งที่ D3 ทำได้ แต่ก็เป็นประสบการณ์เจ๋ง ๆ ครั้งแรกที่ได้สร้างภาพบนคอมพิวเตอร์ด้วยตัวเอง
ส่วนตัวแล้ว D3 ไม่เคยให้ความรู้สึกเป็นธรรมชาติเลย ปัญหาอาจอยู่ที่มันพยายามทำหลายอย่างเกินไปใน ระดับการนามธรรม ที่มากเกินไป
ถ้าเป็นแค่เรื่องการฉายข้อมูลก็เข้าใจง่าย แต่ดูเหมือนการฉายจะผูกกับแกนและองค์ประกอบอื่น ๆ อย่างแนบแน่นด้วย
ผมมองว่า
selectและการคำนวณความแตกต่างของselectที่ mbostock บอกว่าเป็น abstraction แกนหลักของ D3 นั้น ใกล้เคียงกับเครื่องมืออำนวยความสะดวกสำหรับเขียนpaint()ที่เรียกซ้ำได้มากกว่าเพียงแต่คำสั่ง paint ถูกแสดงเป็นคำสั่งแบบ builder, ตัวมันเองถูกผูกไว้ในขอบเขตของ select และมีของตกแต่งเพิ่มเข้ามาว่าสามารถแยกเป็นส่วน ๆ เพื่อทำเอฟเฟกต์หลายอย่างได้เท่านั้น
โดยเฉพาะในตัวอย่างแอนิเมชัน สิ่งที่ D3 ทำให้นั้นน้อยจนน่าตกใจ และงานอย่างการใช้ลูปภายนอกกับการติดตามสถานะตามเวลาต้องทำเอง
D3 ไม่ได้ให้ abstraction สำหรับห่อหุ้มการทำ visualization ไม่ว่าจะเป็นแบบฟังก์ชันหรือรูปแบบอื่น ส่วนนี้จึงถูกทิ้งไว้เป็นการบ้านของผู้อ่าน
สำหรับผู้ใช้ D3 หน้าใหม่ ทั้งหมดนี้เป็นเรื่องน่าประหลาดใจหรือช็อกอย่างมาก คล้ายกับสถานการณ์ที่นำฐานข้อมูลใหม่มาใช้แล้วพบว่ามีแค่ไลบรารี file I/O, ดัชนี B-tree และ query optimizer แต่ต้องเชื่อมทุกอย่างเข้าด้วยกันเอง
เป็นรูปแบบที่แทนที่
d3-selectซึ่งเป็นโมดูลจัดการ DOM ของ D3 ด้วย React การที่สิ่งนี้เป็นไปได้และทำงานได้ดีเป็นหลักฐานว่า design ของ D3 นั้นยอดเยี่ยมขึ้นอยู่กับเป้าหมาย อาจเป็นเครื่องมือที่จำเป็นหรือไม่จำเป็นก็ได้
ยังใช้ helper function หลายอย่าง เช่น easing หรือ scaling อยู่ แต่คอมโพเนนต์จริง ๆ สร้างด้วยเฟรมเวิร์กสมัยใหม่แล้ว ในกรณีของผมคือ Vue 3 กับ TypeScript
ถึงอย่างนั้นก็ยังขอบคุณ D3.js สำหรับช่วงเวลาที่งดงาม และที่สอนแนวปฏิบัติที่ดีหลายอย่างของ data visualization
ค่า default และ demo ของ Mike Bostock เป็นทั้งแรงบันดาลใจและตัวอย่างของมาตรฐานที่ดี และเข้ากันได้ดีกับมินิมัลลิสม์ของ Tufte
D3 กับ jQuery คล้ายกันในระดับหนึ่ง และทั้งคู่มีแนวโน้มจะกลายเป็น โค้ดสปาเก็ตตี้ ได้ง่าย เครื่องมืออย่าง VisX เพิ่มโครงสร้างจำนวนมากไว้บน D3 ที่ใช้อยู่ ทำให้ยัง sane ได้
แต่ก็สงสัยว่า ถ้าจะทำอะไรที่ custom มากขึ้นเมื่อเทียบกับการใช้ D3 ล้วน ๆ จะรู้สึกว่ามีข้อจำกัดแบบต้องสู้กับเครื่องมือหรือเปล่า
อีกเครื่องมือหนึ่งที่ได้แรงบันดาลใจจาก GG คือ ggplot2 ซึ่งตั้งชื่อได้เหมาะเจาะ และเป็นของภาษา R
มันมีอินเทอร์เฟซที่กระชับกว่ามากและใกล้เคียง functional มากกว่า อีกทั้งยังเข้ากันได้ดีกับเครื่องมือที่พบไม่บ่อยชื่อ Rush ซึ่งสามารถ pipe CSV เข้าไปเพื่อสร้างกราฟิกได้อย่างรวดเร็ว กล่าวคือเป็น R one-liner สำหรับเชลล์
เครื่องมือพวกนี้มักพึ่งพาความสามารถของเบราว์เซอร์ หรือใช้โซลูชัน server-side rendering ที่ดูปะติดปะต่อ โดยใช้ headless browser สำหรับการสร้างฝั่งเซิร์ฟเวอร์
โดยเฉพาะถ้าสร้าง Venn diagram แบบโปรแกรมได้ก็คงดี แปลกที่ด้านนี้แทบไม่มีอะไรเลย
ไลบรารีชาร์ต JavaScript บางตัวรองรับก็จริง แต่โดยรวมดูเหมือนแทบไม่มีการรองรับ
gnuplot ดูดี แต่ไม่มีการรองรับ Venn diagram
มันยังเป็น dependency ของ OpenSearch Dashboards ด้วย ทำให้ผู้ใช้สร้าง แดชบอร์ดแบบกำหนดเอง บนข้อมูล log และ observability ได้[2]
ไลบรารี Vega น่าจะช่วยลดปัญหาความยากในการเรียน D3 ที่คนอื่น ๆ พูดถึงได้ในระดับหนึ่ง
[1] https://vega.github.io/vega/docs/
[2] https://opensearch.org/docs/latest/dashboards/visualize/vega...