1 điểm bởi GN⁺ 2024-06-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • eplot là một gói nhằm vẽ các biểu đồ đơn giản từ dữ liệu số ngay trong Emacs, xuất phát từ những hạn chế về hiển thị trục và tính tiện dụng của chart.el cùng tổ hợp Org/Gnuplot
  • Vấn đề lớn nhất là vạch chia trục Y: cần xử lý tự nhiên các con số đẹp theo hệ 1·2·5 cũng như các thang đo cực đoan và khoảng thời gian đặc biệt
  • Khi chuyển kinh nghiệm từ thư viện biểu đồ PHP cũ sang Emacs Lisp, tác giả đã triển khai các biểu đạt như gradient dựa trên SVG và dark mode, nhưng bỏ qua một số hiệu ứng cần xử lý ở mức pixel
  • Khi chạy M-x eplot trong một buffer có nhiều số, một buffer biểu đồ sẽ mở ra, và có thể nhanh chóng thay đổi cấu hình bằng headers cùng C-c C-c để xem kết quả
  • Mã nguồn đã được công khai trên GitHub, nhưng vẫn là mã đang trong quá trình hoàn thiện, được viết khá nhanh trong một tuần theo hướng bám sát các test case, nên vẫn còn việc dọn dẹp luồng mã và cải thiện độ dễ đọc

Vì sao muốn vẽ biểu đồ ngay trong Emacs

  • Tác giả đã tìm kiếm từ lâu một cách dễ dàng để tạo các biểu đồ đơn giản, và khi viết một bài liên quan đến điểm phim thì đã thử dùng chart.el tích hợp sẵn trong Emacs
  • chart.el có đi kèm Emacs, nhưng ban đầu nó xuất phát từ công cụ kiểm thử eieio, nên phạm vi sử dụng khá hạn chế
  • Dù nhìn chung vẫn làm được những việc cần thiết, nhưng đặc biệt phần hiển thị trục Y không khiến tác giả hài lòng

Vạch chia trục quyết định chất lượng biểu đồ

  • Cách hiển thị trục tệ thì rất dễ nhận ra, nhưng để làm cho nó thực sự tự nhiên thì phải xử lý cẩn thận nhiều trường hợp biên
  • Google Finance trước đây cũng từng dùng một trục thiếu tự nhiên: lấy giá trị lớn nhất làm vạch trên cùng của trục Y rồi thêm các đường cách đều theo hướng về gốc tọa độ
    • Tác giả nhớ rằng kiểu biểu đồ này còn tồn tại đâu đó tới khoảng năm 2021
    • Sau đó, khi toàn bộ trang được triển khai lại, hệ trục cũng được cải thiện tốt hơn
  • Khoảng năm 1997, khi làm việc tại một công ty môi giới chứng khoán, tác giả từng có kinh nghiệm triển khai một thư viện biểu đồ
  • Bài toán vạch chia trục không hẳn là một bài toán toán học khó, mà gần hơn với việc chọn cẩn thận các con số đẹp và các khoảng ngoại lệ
    • Các con số đẹp thường xoay quanh nhiều thang của 1, 2, 5
    • Trong biểu đồ chứng khoán, có thể gặp những khoảng như $0.00001~$0.00002, hoặc 1e9~1e10
    • Với trục thời gian thì còn phải tính đến năm, nửa năm, quý, tháng, tuần, thậm chí cả trường hợp chia tháng theo đơn vị tuần

Những điểm khiến khó dùng nguyên các công cụ cũ

  • Thư viện biểu đồ PHP từng làm trước đây khá tiện để tạo đầu ra trên web server, nhưng lại không phù hợp để thử nghiệm bằng cách thao tác trực tiếp với số liệu trong Emacs
  • Cũng như lý do Excel và Jupyter Notebook được ưa chuộng, quá trình điều chỉnh dữ liệu theo kiểu tương tác để dần tiến tới biểu đồ mong muốn là rất quan trọng
  • Org cũng có chức năng vẽ biểu đồ, nhưng Org plot dùng Gnuplot làm backend
  • Gnuplot nhìn chung vẫn dùng được, nhưng khi muốn thay đổi những mặc định như định dạng số trên trục Y trong ví dụ thì mức độ phức tạp có thể tăng lên đáng kể

Cách triển khai eplot và các tính năng biểu đạt

  • Vì tên chart đã được dùng rồi, tác giả đặt tên gói mới là eplot
  • Ban đầu tác giả không định chuyển toàn bộ chức năng từ thư viện PHP cũ sang, nhưng khi bắt tay vào làm thì rốt cuộc lại dựng lại hầu hết mọi thứ
  • Bản mới còn có cả những tính năng như dark mode
  • Gradient trong thư viện PHP trước đây được làm theo cách viết tay, và tác giả nhớ là còn có cả tài nguyên như colormap của GIF
  • Phiên bản Emacs Lisp thì dùng SVG
    • Vì SVG hỗ trợ gradient, tác giả kết hợp polygon với gradient để tạo ra hiệu ứng tương tự
    • Có thể đạt kết quả gần giống với bản PHP gốc
  • Có một kiểu gradient đặc biệt khác thì không được triển khai
    • Nó đòi hỏi xử lý ở mức pixel hoặc ít nhất là mức dòng nên khá khó
    • Có thể còn cần thêm các phép tính toán học, nên đã bị loại ra

Luồng sử dụng và cách cấu hình

  • Khi chạy M-x eplot trong một buffer chứa nhiều con số, biểu đồ sẽ được hiển thị trong một buffer riêng
  • Để điều chỉnh biểu đồ thành đúng dạng mong muốn, tác giả đưa vào khái niệm headers
  • Phần lớn các tùy chọn hữu ích đều có thể điều khiển bằng headers
    • Sau khi thêm headers, chỉ cần nhấn C-c C-c là có thể xem ngay kết quả
    • Cũng có cả eplot mode để việc này trở nên dễ dàng hơn
  • Một ví dụ đơn giản được cung cấp dưới dạng biểu đồ hiển thị thu gọn, và hầu hết các biến thể trong ảnh đầu bài cũng đều được tạo bằng headers

Tình trạng công khai và phần việc còn lại

  • Tác giả đã viết README.md để ghi lại nhiều khả năng sử dụng khác nhau
  • Mã nguồn được công khai trên Microsoft Github
  • Trạng thái hiện tại vẫn là work in progress
  • Về cơ bản tác giả cho rằng nó đã có thể hữu ích ở một mức nào đó, nhưng vì được viết trong lúc liên tục chỉnh sửa suốt một tuần nên khó khẳng định về độ ổn định
  • Mã hiện được viết theo hướng hơi kém hiệu quả để bám theo từng test case, nên vẫn cần dọn dẹp
    • Cần hợp nhất nhiều luồng mã khác nhau
    • Cần cải thiện độ dễ đọc của mã
  • Trước mắt tác giả đã đẩy lên ở trạng thái hiện tại để nghỉ ngơi một chút, nên người dùng thực tế vẫn cần thận trọng

1 bình luận

 
GN⁺ 2024-06-28
Ý kiến trên Hacker News
  • Gọn gàng! Cách đưa gradient vào vừa đơn giản vừa thông minh
    Vì tôi thích lĩnh vực này nên xin thêm vài lời khuyên chung: trước đây khi làm kỹ sư cho thư viện Grapher (https://github.com/owid/owid-grapher) tại Our World in Data cùng Max Roser và Hannah Ritchie, tôi đã học được rất nhiều về cách tạo biểu đồ tốt
    Nhìn các ví dụ thì nên đừng xem nhẹ tiêu đề, phụ đề và chú thích. Bạn đã làm sẵn “header đơn giản” rồi nên chắc sẽ dễ đưa vào, và chỉ vài câu ngắn cũng tạo khác biệt lớn. Tôi cũng khuyên đọc “Storytelling with Data” của Cole Nussbaumer Knaflic
    Nếu tiếp tục phát triển, có lẽ một ngày nào đó bạn sẽ muốn thêm cả thư viện luồng dữ liệu và DSL. dplyr của Hadley Wickham trong R là đỉnh nhất; tôi cũng đã tham khảo cách đó trong công cụ Ohayo của mình và thư viện CoreTable của OWID Grapher (https://github.com/owid/owid-grapher/tree/master/packages/%4...). Thư viện tương đối mới của Jeffrey Heer, Arquero (https://idl.uw.edu/arquero/), cũng cùng dòng như vậy
    Gần đây tôi đang xem công cụ mới Plot của Mike Bostock (https://observablehq.com/plot/); mới dùng thử một hai ngày thôi nhưng thấy đáng kỳ vọng. Hiện tôi không dùng Emacs, nhưng hy vọng những điều trên hữu ích
  • Thảo nào gần đây tôi không tìm thấy bài “sửa 10% lỗi của Emacs”. Hóa ra là đang làm cái này. Tuyệt, đúng là cao thủ Emacs
  • Trông hay đấy! Nếu dùng tính năng biến cục bộ theo tệp và thư mục của Emacs cho cấu hình biểu đồ thì có thể tạo trải nghiệm người dùng linh hoạt hơn
    Ví dụ, có thể bạn đang tạo tệp dữ liệu và không muốn chỉnh thủ công trước khi vẽ biểu đồ, hoặc muốn thử vẽ từng tệp khi cần trong một thư mục dữ liệu lớn mà không phải tự tay gắn header cho mỗi tệp
  • Khi vẽ đồ thị trong org mode cũng có thể dùng Python và matplotlib. Không phải chỉ dùng được Gnuplot
    • Matplotlib vốn đã có API khá khó chịu, và tôi không nghĩ bọc thêm elisp wrapper lên trên sẽ biến nó thành thứ dễ dùng
      Như bài gốc nói, rất có khả năng lượng code cần viết lại còn nhiều hơn tự triển khai trực tiếp
    • Điều luôn làm tôi khó chịu ở matplotlib và gnuplot là dường như đúng nghĩa cái gì cũng có một lệnh hoặc lời gọi hàm riêng
      Kiểu muốn đổi kích thước vạch chia cấp ba trên trục Y thì gọi một hàm như set_third_level_y_ticks(). Không hẳn là xấu, và có lẽ cũng khó tránh, nhưng cảm giác mọi thứ đều được xử lý đặc thù nên thiếu tính trực giao
    • Cũng có ESS(Emacs Speaks Statistics). Nó gắn R/Julia rất mạnh vào org-mode, nên có thể dùng những thứ như ggplot2 hoặc makie
      Dù vậy, tôi vẫn tôn trọng nỗ lực tạo thứ gì đó bằng elisp thuần
    • Cũng có thể dùng R và các thư viện đồ họa của nó
  • Đúng là hack thứ thiệt. Tôi đặc biệt thích phần gradient
    Việc các plot này là SVG nên có thể đưa vào LaTeX hoặc trình duyệt web cũng là một điểm lớn. Trường hợp đầu khiến nó trở thành ứng viên khá mạnh khi cần tạo plot để chèn vào bài báo khoa học. Sản phẩm tốt
  • Đây là lần đầu tôi thấy hai từ “Microsoft Github” được đặt cạnh nhau một cách lộ liễu, và dù chuyện đó đã thành sự thật được vài năm rồi, tôi vẫn thấy khó chịu
    • Tôi vẫn không hiểu vì sao nhiều dự án tự do/mã nguồn mở vẫn dùng nền tảng đó. GitHub đã rất thành công trong việc khiến người ta không nhìn thấy tiền tố Microsoft
      Dù vậy, giờ có vẻ Codeberg cuối cùng cũng đang có chút đà trong cộng đồng các dự án tự do/mã nguồn mở
    • Vì thế tôi nghĩ GitHub vẫn cố tỏ ra như một startup độc lập ngày xưa. Nhiều lập trình viên độc lập cũng cảm thấy tương tự, và nghiêng về các giá trị của tự do phần mềm hơn là giá trị cổ đông hay chủ nghĩa tư bản Big Tech
      Tôi vừa mở trang chủ github.com và Ctrl-F tìm “Microsoft” thì thấy 0 kết quả
    • Tôi cũng có phản ứng y hệt. Hy vọng một ngày nào đó họ đừng đổi thương hiệu thành MS GitHub