4 điểm bởi GN⁺ 2024-05-18 | 1 bình luận | Chia sẻ qua WhatsApp
  • D3 in Depth là tài liệu học tập dựa trên D3 6·7, trình bày quá trình tạo trực quan hóa dữ liệu tùy biến bằng D3.js
  • Tài liệu tập trung vào xây dựng trực quan hóa tùy biến hơn là chỉ cách dùng các biểu đồ đơn giản, đồng thời giúp người học nắm cả các thành phần cấu thành trực quan hóa trên web
  • Nền tảng cơ bản về HTML, SVG, CSS, JavaScript được kết nối với công việc dùng D3, nhờ đó hỗ trợ hiểu về biểu đạt dữ liệu trên nền web
  • Nội dung cũng liên kết với các tài liệu về dashboard và data story sử dụng React, Chart.js, Leaflet, từ đó tạo nên lộ trình học trực quan hóa bằng JavaScript
  • Với độc giả muốn học D3 chuyên sâu, đây có thể được dùng như tài liệu nhập môn lẫn nâng cao, kết hợp giữa hiểu khái niệm và thực hành

Phạm vi mà D3 in Depth đề cập

  • D3 in Depth dành cho D3 phiên bản 6 và 7
  • Có thể học cách tạo trực quan hóa dữ liệu tùy biến bằng D3.js
  • Tài liệu cũng đề cập HTML, SVG, CSS, JavaScript như những thành phần nền tảng cần thiết để xây dựng trực quan hóa trên web

Tài liệu trực quan hóa JavaScript có thể xem cùng

  • Data Dashboards with JavaScript trình bày cách tạo dashboard dữ liệu bằng React, Chart.js, Leaflet
  • Visualising Data with JavaScript trình bày cách tạo biểu đồ và data story bằng Chart.js, Leaflet, D3, React
  • Một nhận xét của độc giả đánh giá cao tài liệu này trong số các sách về D3, cho rằng nội dung rõ ràng, dễ theo dõi và nền tảng khái niệm vững chắc

1 bình luận

 
GN⁺ 2024-05-18
Ý kiến trên Hacker News
  • Ý tưởng dùng D3 để trực quan hóa dữ liệu là hay, nhưng nếu muốn một công cụ cấp cao hơn một chút, Observable Plot[1] do nhóm D3 tạo ra cũng đáng xem
    Đây là một thư viện đặt thêm nhiều quy ước và tiện ích lên trên D3 để tạo graph, chart và plot
    Xa hơn nữa còn có Observable Framework[2], một trình tạo site tĩnh cho dashboard trực quan hóa, hỗ trợ Plot, D3 và nhiều thư viện khác
    1: https://observablehq.com/plot/
    2: https://observablehq.com/framework/
    • Dạo này tôi lại bị hấp dẫn theo hướng ngược lại. Phần lớn thời gian, người ta đã biết kết quả cuối cùng phải trông chính xác như thế nào, còn framework về bản chất cung cấp rất nhiều cấu hình định sẵn, và chỉ cần muốn lệch khỏi các cấu hình đó một chút là trở nên khổ sở
      Với nhiều loại plot, việc trực tiếp thao tác dữ liệu SVG thực ra thường dễ hơn, và cũng không quá khó
      Tôi mong có thư viện hoặc framework giúp thao tác đầu ra SVG hoặc canvas dễ hơn. Những chỉnh sửa nhỏ phải cực kỳ dễ, nhưng framework càng ở cấp cao thì càng khó đi chệch khỏi con đường đã định
    • Observable Plot rất tuyệt. Nó rất linh hoạt và trực quan khi dùng, nên giờ tôi thích nó hơn Plotly.js mà trước đây từng dùng
      Tài liệu cũng khá ổn, nhưng thiếu một phần API reference dùng được, nên không tiện để khám phá tính năng
    • Tôi tự hỏi liệu có giao diện kéo-thả kiểu Matlab cho trực quan hóa web không
      Tôi cố tránh tối đa việc tạo graph bằng HTML5 canvas, nên hy vọng có một cách thiết kế mới nào đó
    • Plot và Framework bị gắn với hệ sinh thái Observable, và bản thân nó cũng có đường cong học tập. Học D3 vẫn là tốt nhất về mặt linh hoạt và quyền kiểm soát
    • Không biết website này có khiến người khác cũng thấy giật lag không. Các trang web nhiều nội dung thường xuyên tạo cảm giác khựng
      Sửa: bật tăng tốc phần cứng thì mượt hơn, nhưng ngay cả trên Ryzen 9 vẫn lag hơn kỳ vọng
  • Tôi thích D3 và đã làm khá nhiều thứ với nó, nhưng mỗi lần không dùng vài năm rồi quay lại, tôi gần như chẳng nhớ gì, tài liệu lại làm mọi thứ rối hơn, và có cảm giác phải quay về vạch xuất phát
    Nếu bảo tôi giải phương trình vi phân riêng phần sau 10 năm không động tới, có lẽ tôi còn lấy lại cảm giác nhanh hơn
    Tôi cũng thấy tài liệu tham chiếu của D3 thật sự tệ hại
    • Tôi đã dùng D3 rất nhiều từ phiên bản 2 đến 7, và do các đợt refactor trong thời gian đó, các ví dụ online vốn đã khó hiểu lại càng khó cập nhật hơn
      Dù vậy, giờ có vẻ nó đã ổn định hơn. Tôi bắt đầu viết theo phong cách mệnh lệnh hơn với Svelte+D3 thay vì chỉ dùng D3, và nhờ đó mới bắt nhịp được
      Việc hiểu các phần tử được tạo ra cũng dễ hơn so với cách sau đó soi các phần tử đã sinh bằng devtools
      Trang này hữu ích cho việc dùng D3 cùng Svelte: https://svelte.recipes/
    • Tôi cảm thấy vấn đề đó ít hơn nhiều so với các thư viện vẽ plot khác
      80% công việc của tôi gần với ứng dụng, 10% là hệ thống, 10% là phân tích dữ liệu; thỉnh thoảng tôi tạo notebook Jupyter trong 2 tuần rồi không nhìn lại trong 2 tháng
      Hầu hết thư viện vẽ plot có rất nhiều quy tắc tùy ý phải ghi nhớ, và thường có nhiều ngôn ngữ chuyên biệt theo miền nho nhỏ. Kiểu như một chuỗi đơn giản lại được diễn giải phức tạp hơn atoi rất nhiều
      Hơn nữa, ở nhiều mảng như quyết định phạm vi trục, xử lý lượng điểm rất lớn, theo quan điểm của tôi đều có gì đó sai sai
      D3 bắt bạn tự làm nhiều thứ, nhưng các interface cho việc đó về mặt khái niệm lại trực quan. Tôi nghĩ thà làm cho đúng bằng D3.js còn hơn dùng thứ mã tổng quát cồng kềnh, nhiều lỗi của người khác với API tạo cảm giác như lắp một con tàu trong chai
    • Tôi đã dùng D3 rất nhiều, đến mức từng tạo cả phần tích hợp cho AngularJS và Angular. Nó mạnh, nhưng tôi luôn cảm thấy rất không trực quan
      Rất dễ dùng sai, khó debug và cũng khó hiểu
      Điều đó không có nghĩa là vấn đề này dễ giải. Nếu cần tạo đồ họa dựa trên dữ liệu rất cụ thể, có lẽ tôi vẫn sẽ chọn D3
    • Giao diện tính toán cho con người dành cho giải tích đã được trau chuốt cẩn thận qua nhiều thế hệ. Chỉ cần đọc một chút bản gốc của Newton là thấy ngay rằng trước đây không phải lúc nào cũng như vậy
      So sánh API theo tiêu chuẩn đó thật ra có vẻ không công bằng
    • Tôi cũng có trải nghiệm tương tự. Với tư cách tech lead hiện nay, tôi kiên quyết yêu cầu không dùng các thư viện đòi hỏi kiến thức miền ở mức cao
      Nên tránh tối đa loại mã mà ngay cả tác giả cũng khó hiểu, và D3 là ví dụ tiêu biểu cho loại thư viện đó
  • Tôi nghĩ D3 vẫn đáng học ngay cả khi cuối cùng không dùng trong công việc thực tế. Cốt lõi của thư viện này là đối tượng mà dữ liệu được chiếu lên và chiều của chính dữ liệu luôn khác nhau
    Ví dụ, nếu vẽ dữ liệu trong khoảng 0–100 điểm lên màn hình 1080p kích thước 1920x1080, đến một lúc nào đó bạn phải quyết định sẽ scale dữ liệu thế nào cho phù hợp với phép chiếu lên màn hình
    Bạn có thể tự tính toán, hoặc giao việc tính toán cho một thư viện như D3
    Ngay cả khi không vẽ dữ liệu trên web, rồi sẽ có lúc bạn cần vẽ dữ liệu ở đâu đó, và khi đó việc tìm được công cụ đóng vai trò tương tự trong hệ sinh thái ấy sẽ rất hữu ích
    • Một trong những chương trình PHP đầu tiên tôi tự làm là trình tạo PNG đồ thị phân phối nhị thức
      Tôi nhớ là mình phải scale các hình chữ nhật vẽ trên graph sao cho phù hợp với kích thước PNG đang tạo
      Tất nhiên nó rất nhỏ nhặt và hoàn toàn khác với những điều tuyệt vời mà D3 có thể làm, nhưng đó là một trải nghiệm tuyệt vời đầu tiên khi tự tay tạo ra hình ảnh trên máy tính
    • Đây là một lời giải thích hay để nắm khái niệm cốt lõi
      Cá nhân tôi chưa bao giờ thấy D3 trực quan. Có thể vấn đề là nó cố làm quá nhiều thứ ở quá nhiều mức trừu tượng
      Nếu chỉ nói về việc chiếu dữ liệu thì dễ hiểu, nhưng có lẽ vì phép chiếu lại gắn chặt với trục và các thành phần khác
  • Vấn đề thật sự của D3 là với tư cách một thư viện, nó thực ra không trực quan hóa giúp bạn. Nó chỉ cung cấp các hàm và ví dụ để bạn tự ghép thành trực quan hóa, và yêu cầu cốt lõi cho việc đó là hiểu JavaScript ở mức chuyên gia, đặc biệt là closure và lập trình hàm

Tôi cho rằng phép tính khác biệt giữa selectselect mà mbostock gọi là phần trừu tượng cốt lõi của D3, gần với một tiện ích để viết paint() có thể tái nhập hơn
Chỉ là các câu lệnh paint được biểu diễn thành câu lệnh builder, bản thân chúng được gói trong phạm vi select, và có thêm lớp trang trí là có thể tách nhỏ ra cho nhiều hiệu ứng khác nhau
Đặc biệt trong các ví dụ animation, phần D3 làm ít đến mức đáng ngạc nhiên; việc dùng vòng lặp bên ngoài và theo dõi trạng thái theo thời gian thì bạn phải tự làm
D3 cũng không cung cấp abstraction để đóng gói visualization, dù là dưới dạng hàm hay dạng khác; phần này được để lại như bài tập cho người đọc
Với người mới dùng D3, tất cả những điều này là một bất ngờ lớn, thậm chí gây sốc. Nó giống như khi đưa vào một database mới mà chỉ có thư viện I/O file, chỉ mục B-tree và query optimizer, rồi bạn phải tự nối tất cả lại với nhau

  • Rất đáng xem visx. Thật ra có lẽ nên gọi nó là D4, tức Declarative Data Driven Documents (Tài liệu điều khiển bởi dữ liệu theo kiểu khai báo)
    Đây là dạng thay mô-đun thao tác DOM của D3, d3-select, bằng React. Việc điều này khả thi và hoạt động tốt chính là bằng chứng cho thấy thiết kế của D3 rất xuất sắc
  • D3 không phải là một bộ công cụ vẽ biểu đồ như matplotlib hay ggplot, mà là thư viện cấp thấp để xây dựng trực quan hóa dữ liệu từ đầu
    Tùy mục tiêu của bạn, nó có thể là công cụ cần thiết hoặc không
  • Tôi từng thích D3.js và đã dùng nó làm công nghệ cốt lõi cho hàng chục dự án trực quan hóa dữ liệu, cả thương mại lẫn cá nhân. Tuy vậy, giờ đây cú pháp rendering của nó trông đã cũ, đến mức gợi nhớ thời jQuery
    Tôi vẫn dùng nhiều hàm hỗ trợ như easing hay scaling, nhưng các component thực tế thì đang làm bằng framework hiện đại. Trường hợp của tôi là Vue 3 và TypeScript
    Dù vậy, tôi vẫn biết ơn D3.js vì những năm tháng đẹp đẽ mà nó mang lại và vì đã dạy tôi nhiều thực hành tốt trong trực quan hóa dữ liệu
    Các default và demo của Mike Bostock từng là nguồn cảm hứng và ví dụ về chuẩn mực tốt, đồng thời cũng rất hợp với chủ nghĩa tối giản của Tufte
    • Nếu có ví dụ dùng các hàm hỗ trợ D3 cùng với Vue 3 và TypeScript thì tôi rất muốn xem
  • Sau khi đã học D3, nếu giả định là làm thứ gì đó giống biểu đồ, tôi nghĩ tốt nhất là chuyển sang VisX hoặc một công cụ tương đương không phải React rồi đừng ngoái lại
    D3 và jQuery giống nhau ở một mức độ nào đó, và cả hai đều rất dễ thành spaghetti code. Những công cụ như VisX thêm khá nhiều cấu trúc lên trên D3 mà chúng dùng, giúp mọi thứ duy trì được sự sane
    • Tôi đã dùng D3 ngắt quãng trong một thời gian khá dài, và giờ mới bắt đầu với React và visx; nó có vẻ đầy hứa hẹn vì lấp khá tốt khoảng cách giữa hai bên
      Tuy nhiên tôi tò mò liệu bạn có cảm thấy nó hạn chế theo kiểu phải vật lộn với công cụ khi muốn làm thứ tùy biến hơn so với dùng D3 thuần không
  • D3 được truyền cảm hứng từ ngữ pháp đồ họa của Wilkinson
    Một công cụ khác lấy cảm hứng từ GG là ggplot2, cái tên cũng rất phù hợp, dành cho ngôn ngữ R
    Nó cung cấp interface ngắn gọn hơn nhiều và gần với functional hơn, đồng thời cũng rất hợp với một công cụ hiếm gặp tên Rush, tức R one-liner cho shell, có thể nhận CSV qua pipe để nhanh chóng tạo đồ họa
  • Tôi vẫn đang tìm một giải pháp sơ đồ/biểu đồ hoàn toàn không dựa trên web. Nó cần chạy được bằng CLI hoặc thư viện và xuất SVG hoặc PNG
    Những công cụ kiểu này thường dựa vào tính năng của trình duyệt, hoặc dùng các giải pháp server-side rendering khá vụng về với headless browser để tạo ở phía server
    Đặc biệt, sẽ rất tốt nếu có thể tạo biểu đồ Venn bằng lập trình. Lạ là gần như không có gì trong mảng này
    Một vài thư viện biểu đồ JavaScript có hỗ trợ, nhưng nhìn chung có vẻ gần như không được hỗ trợ
    gnuplot trông có vẻ tốt nhưng không hỗ trợ biểu đồ Venn
  • Chỉ tài liệu này mới giúp tôi hiểu D3. Tác giả cũng phản hồi nhanh và rất hữu ích
  • Tôi đã nghe nhiều đánh giá tốt về Vega[1], một công cụ chạy trên D3
    Nó cũng là dependency của OpenSearch Dashboards, cho phép người dùng tạo dashboard tùy chỉnh trên dữ liệu log và observability[2]
    Thư viện Vega có vẻ có thể giảm bớt phần nào vấn đề độ khó khi học D3 mà những người khác nói tới
    [1] https://vega.github.io/vega/docs/
    [2] https://opensearch.org/docs/latest/dashboards/visualize/vega...