Eplot: Gói mới để tạo biểu đồ trong Emacs
(lars.ingebrigtsen.no)- 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.elcù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 eplottrong 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ùngC-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.eltích hợp sẵn trong Emacs chart.elcó đ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ặc1e9~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 eplottrong 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-clà 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
- Sau khi thêm headers, chỉ cần nhấ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
Ý kiến trên Hacker News
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
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
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
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 giaoDù vậy, tôi vẫn tôn trọng nỗ lực tạo thứ gì đó bằng elisp thuần
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
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ở
Tôi vừa mở trang chủ github.com và Ctrl-F tìm “Microsoft” thì thấy 0 kết quả