3 คะแนน โดย GN⁺ 2023-07-16 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Lets-Plot เป็นไลบรารีพล็อตแบบมัลติแพลตฟอร์มที่รองรับการทำภาพข้อมูลสถิติใน Python และ Kotlin โดยอิงหลักการ Grammar of Graphics
  • มีการแยก implementation สำหรับ Python และ Kotlin ทำให้ใช้งานได้ตาม เวิร์กโฟลว์ของแต่ละ ecosystem ตั้งแต่สภาพแวดล้อมโน้ตบุ๊กไปจนถึง IDE และการพัฒนาแอป
  • ใน Python สามารถดูพล็อตได้ทั้งในโน้ตบุ๊ก และใน SciView ของ PyCharm กับ IntelliJ IDEA
  • ใน Kotlin มุ่งรองรับกรณีใช้งานด้านการทำภาพข้อมูล ตั้งแต่ Kotlin notebook ไปจนถึง Compose-Multiplatform apps
  • มี geocoding, การพล็อต GeoDataFrame และการปรับแต่ง tooltip/annotation จึงใช้ได้กับ ข้อมูลเชิงพื้นที่ และการสร้างพล็อตแบบโต้ตอบได้

ภาพรวมของ Lets-Plot

  • Lets-Plot เป็นไลบรารีพล็อตแบบมัลติแพลตฟอร์มที่อิงหลักการ Grammar of Graphics
  • หากต้องการเรียนรู้ ggplot2 ควบคู่กับ Grammar of Graphics แนะนำให้ใช้ “ggplot2: Elegant Graphics for Data Analysis” ของ Hadley Wickham เป็นเอกสารอ้างอิง
  • เอกสารเริ่มต้นและตัวอย่างมีให้ตามเส้นทางต่อไปนี้

แพลตฟอร์มที่รองรับและฟีเจอร์หลัก

  • Python

  • Kotlin

    • เป็นไลบรารีทำภาพข้อมูลแบบมัลติแพลตฟอร์มสำหรับ Kotlin ที่ให้บริการในชื่อ Grammar of Graphics for Kotlin
    • มุ่งรองรับกรณีใช้งานใน ecosystem ของ Kotlin ตั้งแต่ Kotlin notebook ไปจนถึง Compose-Multiplatform apps
  • การทำภาพข้อมูลภูมิสารสนเทศ

    • สามารถค้นหาอ็อบเจกต์เชิงพื้นที่ได้ด้วยโมดูล Geocoding
    • หากมี GeoDataFrame อยู่แล้ว ก็สามารถ พล็อต ได้ทันที
  • Tooltip และ annotation

    • สามารถปรับแต่งเนื้อหา รูปแบบค่า และรูปลักษณ์ของ tooltip และ annotation ในเลเยอร์ของพล็อตได้

1 ความคิดเห็น

 
GN⁺ 2023-07-16
ความเห็นจาก Hacker News
  • เจ๋งดี ดูเหมือนจะอิงกับ ไวยากรณ์กราฟิกแบบ ggplot2 ดูตัวอย่างได้ที่นี่: https://lets-plot.org/pages/charts.html
    กราฟข้อมูลก็ดูดีทีเดียว: https://lets-plot.org/pages/charts.html#discrete-icon-discre...
    กราฟการแจกแจงก็ดีเหมือนกัน: https://lets-plot.org/pages/charts.html#visualization-of-dis...
    อยากรู้ว่าโปรเจ็กต์นี้เป็นอย่างไรเมื่อเทียบกับ plotnine ซึ่งเป็นไลบรารีพล็อตแบบ ggplot2 สำหรับ Python

    • อยากรู้ว่า ggplot2 มีความอเนกประสงค์มากพอที่จะสร้างกราฟอะไรก็ได้ตามต้องการหรือเปล่า หรือว่ามันมีสไตล์และประเภทกราฟที่ทำได้เด่นชัดในแบบของตัวเอง แต่จุดที่ดีที่สุดของไลบรารีนี้อาจเป็นการที่ใช้ได้กับ Kotlin ด้วย
  • ข้อเสียของไลบรารีตระกูล ggplot ที่ไม่ได้อยู่บน R คือคุณจะเสีย ไลบรารีเสริม ดีๆ จำนวนมหาศาลที่ใช้กับต้นฉบับได้ไป[1] ส่วนตัวผมมักประมวลผลข้อมูลใน Python เยอะๆ แล้วค่อยส่งออกไป R จากนั้นทำกราฟทั้งหมดที่นั่น
    คนสายสถิติดูจะให้ความสำคัญกับกราฟิกมากกว่า และใช้เวลาขัดเกลาความสมบูรณ์มากกว่า อีกอย่าง Copilot ช่วยเรื่องความหมายเชิงแนวคิดและออปชันของ ggplot ฝั่ง R ได้ดีมาก เพราะมีแหล่งให้เรียนรู้เยอะ ไม่แน่ใจว่าจะทำได้ดีแค่ไหนกับความต่างเล็กๆ น้อยๆ ของไลบรารีเลียนแบบ ggplot ทั้งหลาย
    [1] https://youtu.be/7UjA_5gNvdw

    • เป็นวิดีโอที่ดี แสดงให้เห็นชัดว่า R ให้ พลังในการแสดงออก เพิ่มเติมทั้งด้านคำอธิบายและการสร้างภาพ อาจจะดีกว่าที่จะเรียน R เพิ่มสักหน่อย แทนที่จะไปเรียน plotting wrapper ของ Python เพิ่มอีกตัว
    • เห็นด้วยว่า Copilot ช่วยเรื่องความหมายเชิงแนวคิดและออปชันของ ggplot ฝั่ง R ได้ดี แต่ความต่างแบบนี้คงไม่ใช่อุปสรรคใหญ่สำหรับ โมเดลภาษาขนาดใหญ่ ลองแปลงสคริปต์จากภาษาหนึ่งไปอีกภาษาหนึ่งก็จะเห็นว่าโมเดลภาษาขนาดใหญ่มีความสามารถในการทำให้เป็นนามธรรมทั่วไปได้ดีแค่ไหน แม้จะไม่สมบูรณ์แบบก็ตาม
      ถ้าให้บริบทมากพอ ก็น่าจะสร้างผลลัพธ์ที่ใช้งานได้พอสมควร
  • อันนี้ก็ดูคล้าย plotnine [0] มากเหมือนกัน ซึ่งให้ interface แบบ ไวยากรณ์กราฟิก กับ Python ถึงอย่างนั้นผมก็ชอบ ggplot เลยตั้งตารอวันที่จะได้ลองใช้สิ่งนี้กับงานวิจัย
    น่าจะดีถ้าสามารถพอร์ตหรือเขียน ggthemes, scientificplots [1] และไลบรารี ggplot อื่นๆ ใหม่บน lets-plot ได้
    0: https://plotnine.readthedocs.io/en/stable/
    1: https://github.com/garrettj403/SciencePlots

  • ไม่เข้าใจว่าจำเป็นทำไม มีใครกำลังต้องการ ไลบรารีพล็อต เพิ่มอีกตัวอย่างเร่งด่วนด้วยเหรอ?

    • แค่ทำกราฟเชิงสถิติได้และ ไม่ได้อิงกับ matplotlib ก็เป็นจุดเริ่มต้นที่ดีแล้ว Plotly ก็จุกจิก Altair ก็ใช้งานไม่ค่อยดี bokeh ก็เป็นสไตล์เชิงคำสั่งแบบเดียวกับ matplotlib แถมยังค่อนข้างหนัก
      Seaborn ก็ดี แต่ก็ยังต้องรับมือกับ abstraction ที่รั่วของ matplotlib ทำให้เอามาประกอบกันยากขึ้น และยังได้ความโต้ตอบยากด้วย เพราะงั้นผมอยากได้อะไรแบบนี้ ผมอยากได้กราฟโต้ตอบที่ดี เร็ว และให้ความรู้สึกเนทีฟ จนถึงขั้นเคยลองจะทำเอง Ggplot ทำให้โฟกัสแค่ว่าอยากวาดอะไรแล้วใส่ dataframe เข้าไป ซึ่งอันนี้ก็ดูเป็นแบบนั้น
    • น่าจะทำมาเพื่อใช้ใน Kotlin Notebooks ตัวใหม่ของ JetBrains
    • ทุกคนต้องการนั่นแหละ เพราะตัวเลือกอื่นๆ ต่างก็มีข้อเสียใหญ่ๆ กันทั้งนั้น การมี การแข่งขันมากขึ้น เป็นเรื่องดี
  • มีทิวทอเรียลหรือคู่มือที่เน้น Python สำหรับการสร้างกราฟด้วยแนวทาง ไวยากรณ์กราฟิก แบบนี้ไหม? หรือว่าต้องอ่านหนังสือ ggplot2 แล้วค่อยแปลงตัวอย่าง R เป็น Python?

    • ดูเหมือน Vega-Altair จะมีเอกสารแนะนำเบื้องต้นและทิวทอเรียลของแนวทางตัวเองอยู่
      https://vega.github.io/vega/docs/
  • ทั้งหมดนี้เป็น Kotlin Multiplatform และมีเพียง wrapper บางๆ ของ Python ครอบไว้อีกที น่าประหลาดใจทีเดียว

    • ถ้าใช้ได้กับทุกเป้าหมายของ Compose Multiplatform ก็น่าจะยิ่งน่าทึ่ง ตอนนี้ดูเหมือนว่าจะรองรับ Kotlin/JS และ JVM: https://github.com/JetBrains/lets-plot-kotlin#in-jvm-js
  • ปัญหาใหญ่ที่สุดของไลบรารีพล็อตคือมักจัดการกับ จุดข้อมูลหลายล้านจุด ได้ไม่ดีแบบทันที ในโปรเจ็กต์ด้านวิทยาศาสตร์ข้อมูลครั้งก่อน ฉันลองใช้ไลบรารีพล็อตหลัก ๆ มาหมดแล้ว แต่พอเกินไม่กี่ล้านจุดก็ไม่มีตัวไหนทำงานได้ดี
    ฉันต้องการกราฟที่แสดงผลแบบเรียลไทม์และซูมเข้า/ออกได้ ซึ่งกลายเป็นส่วนที่ยากของโปรเจ็กต์ มีอยู่ผลิตภัณฑ์หนึ่งที่อ้างว่าสามารถทำได้ด้วย Cloud GPU แต่ต้องสมัครสมาชิกแบบเสียเงินและต้องอัปโหลดข้อมูลขึ้นคลาวด์ด้วย ฉันไม่ได้ต้องการแค่ไลบรารีอีกตัวหนึ่ง แต่ต้องการไลบรารีที่ใช้งานได้ดีจริงและสามารถใช้ Local GPU สำหรับการพล็อตได้

    • อันนี้ทำได้: https://github.com/wwwtyro/candygraph
      เลื่อนลงไปที่ตัวอย่างจะมีพล็อตที่มีจุดจำนวนมาก: https://wwwtyro.github.io/candygraph/examples/dist/
    • แม้จะรองรับความสามารถในการโต้ตอบ, พล็อต 3D, และการปรับสไตล์พล็อต แต่หลายตัวก็ยังทำได้แบบครึ่ง ๆ กลาง ๆ หรือไม่ก็พยายามเลียนแบบอินเทอร์เฟซพล็อตของ Matlab ที่ไม่ค่อยใช้งานได้อย่างเป็นธรรมชาติ
    • น่าแปลกที่ ไลบรารีกราฟแบบ immediate mode กลับเหมาะกับงานลักษณะนี้มาก
      https://github.com/epezent/implot
      Java: https://github.com/SpaiR/imgui-java
      Rust ก็มี:
      https://www.egui.rs/#Demo
      ดู Open Plot demo ได้เลย บนเว็บก็น่าจะคอมไพล์เป็น WASM ได้ น่าจะทำเฉพาะส่วนกราฟเป็น WASM แล้วฝังลงใน DOM ที่มีอยู่เดิมได้
    • ถ้าใช้ Julia, Makie จัดการงานลักษณะนี้ได้ดีมาก และยังทำงานร่วมกับ Python ได้ดี
      https://github.com/holoviz/datashader ก็เป็นตัวเลือกที่ใช้ได้ใน ecosystem ของ Python
    • https://www.pyqtgraph.org/
  • ggplot2 ยอดเยี่ยมมากสำหรับการสำรวจข้อมูล นี่เคยเป็นจุดเด่นที่ R เหนือกว่าตัวอื่นอย่างชัดเจน
    สำหรับแดชบอร์ด ฉันชอบ Apache ECharts มากกว่า:
    https://github.com/ecomfe/awesome-echarts

  • เจ๋งมาก นี่คือการ นำ ggplot2 มาเขียนใหม่ บน Python ใช่ไหม? pygg เป็นไลบรารีขนาดเล็กที่แปลงไวยากรณ์ ggplot ของ Python ให้เป็นโค้ด R ggplot2
    ข้อเสียคือมันไม่ใช่แบบโต้ตอบและไปรันบน R ส่วนข้อดีก็คือได้ใช้ implementation ggplot ของ Hadley บน R
    https://github.com/sirrice/pygg

  • สำหรับฉัน รู้สึกน่าผิดหวังนิดหน่อยที่มัน ลอก ggplot มาโดยตรง ggplot ไม่ได้เป็นคำตอบสุดท้ายของการออกแบบไลบรารีด้าน visualization เสมอไป
    ตัวอย่างเช่น ggplot มีแนวคิดเรื่อง scale ที่แทบจะเทียบได้กับฟังก์ชันแบบตรงตัว ซึ่งมีแต่จะเพิ่มความซับซ้อนเชิงแนวคิดที่ไม่จำเป็นให้กับไลบรารี การตัดสิ่งนี้ออกเป็นการปรับปรุงที่ทำได้ไม่ยาก

    • ไม่ว่า ggplot จะมีข้อบกพร่องอะไร มันก็ยังเป็นสิ่งเดียวที่ทำให้ฉันสร้างพล็อตได้เร็วใกล้เคียงกับความเร็วที่ฉันพิมพ์อยู่ เมื่อเทียบกับ matplotlib, base R หรือไลบรารีพล็อตอื่น ๆ ggplot ทำได้แทบไม่ต้องพึ่งตัวช่วยอะไรเลย
      ส่วน matplotlib นั้น กว่าจะเข้าใกล้ได้ต้องใช้มันมามากในช่วงหลัง ๆ แถมยังต้องมี GitHub Copilot ด้วย
    • scale ไม่ได้เป็นฟังก์ชันตรงตัวเสียทีเดียว เพราะการวาดแกนและคำอธิบายสัญลักษณ์ยังต้องมีฟังก์ชันผกผันด้วย และจริง ๆ แล้วความซับซ้อนส่วนใหญ่ของ scale ก็มาจากแกนกับคำอธิบายสัญลักษณ์นี่เอง