Eplot : un nouveau paquet pour créer des graphiques dans Emacs
(lars.ingebrigtsen.no)- eplot est un paquet destiné à tracer des graphiques simples à partir de données numériques directement dans Emacs, né des limites d’affichage des axes et d’ergonomie de
chart.elet de la combinaison Org/Gnuplot - La principale difficulté concerne les graduations de l’axe Y : il faut gérer naturellement des chiffres agréables à lire de la série 1·2·5, ainsi que des échelles extrêmes et des intervalles temporels
- En transposant dans Emacs Lisp une expérience acquise avec une bibliothèque de graphiques en PHP, l’auteur a implémenté des effets comme les dégradés en SVG et le mode sombre, mais certains effets nécessitant un traitement au pixel près ont été laissés de côté
- En lançant
M-x eplotdans un buffer contenant beaucoup de nombres, un buffer de graphique s’ouvre, et les headers avecC-c C-cpermettent de modifier rapidement les réglages et d’en voir le résultat - Le code est publié sur GitHub, mais il s’agit encore d’un work in progress écrit rapidement en une semaine autour de cas de test ; l’organisation des chemins de code et la lisibilité restent à améliorer
Pourquoi vouloir tracer des graphiques directement dans Emacs
- Après avoir longtemps cherché un moyen simple de créer des tracés, l’auteur a essayé
chart.el, intégré à Emacs, en écrivant un billet lié aux notes de films chart.elest inclus dans Emacs, mais cette fonctionnalité provient à l’origine d’un outil de test poureieio, ce qui en fait un outil à l’usage limité- Il permettait globalement de faire ce qu’il fallait, mais l’affichage de l’axe Y était particulièrement insatisfaisant
Les graduations d’axe, décisives pour la qualité d’un graphique
- Un mauvais affichage des axes saute vite aux yeux, mais produire quelque chose de naturel exige en réalité de traiter soigneusement de nombreux cas limites
- Google Finance utilisait autrefois un axe peu naturel où la graduation supérieure de l’axe Y correspondait à la plus grande valeur, puis ajoutait des lignes à intervalles réguliers en direction de l’origine
- L’auteur pense que ce type de graphique existait encore jusqu’aux alentours de 2021
- Le site a ensuite été réimplémenté dans son ensemble et a obtenu de meilleurs axes
- L’auteur a déjà implémenté une bibliothèque de graphiques vers 1997, alors qu’il travaillait dans une société de courtage
- Le problème des graduations d’axe tient moins d’un problème mathématique difficile que d’un choix soigné de chiffres lisibles et de plages exceptionnelles
- Les chiffres agréables à lire sont en général des multiples à différentes échelles de 1, 2, 5
- Dans les graphiques boursiers, on peut rencontrer des plages comme
$0.00001~$0.00002ou1e9~1e10 - Pour l’axe du temps, il faut prendre en compte les années, les semestres, les trimestres, les mois, les semaines, et même le découpage des mois en semaines
Pourquoi il est difficile de réutiliser tel quel les outils existants
- La bibliothèque de graphiques PHP créée auparavant est pratique pour générer des résultats côté serveur web, mais elle n’est pas adaptée à l’expérimentation sur des nombres directement dans Emacs
- Comme le montrent la popularité d’Excel et de Jupyter Notebook, le processus d’ajustement interactif des données jusqu’à obtenir le graphique souhaité est important
- Org propose aussi des fonctions de tracé, mais Org plot utilise Gnuplot comme backend
- Gnuplot est généralement utilisable, mais il peut devenir contraignant dès qu’on veut modifier les valeurs par défaut, par exemple le format des nombres sur l’axe Y dans l’exemple
Implémentation d’eplot et fonctions visuelles
- Le nom
chartétant déjà pris, le nouveau paquet a été nommé eplot - L’auteur ne comptait pas forcément retranscrire toutes les fonctions de la bibliothèque PHP existante, mais en commençant l’implémentation, il a fini par en recréer la plupart
- La nouvelle version inclut aussi des fonctions comme le mode sombre
- Les dégradés de la bibliothèque PHP étaient réalisés à la main, et l’auteur se souvient qu’elle incluait même des ressources comme une palette de couleurs GIF
- La version Emacs Lisp utilise SVG
- Comme SVG prend en charge les dégradés, la combinaison de polygones et de dégradés permet de produire un effet similaire
- On peut ainsi obtenir un résultat proche de l’original PHP
- Un autre dégradé plus inhabituel n’a pas été implémenté
- Il nécessiterait une implémentation au pixel près, ou au moins ligne par ligne, ce qui complique beaucoup la tâche
- Des calculs mathématiques seraient peut-être nécessaires, d’où son exclusion
Flux d’utilisation et mode de configuration
- En lançant
M-x eplotdans un buffer contenant beaucoup de nombres, le graphique s’affiche dans un buffer séparé - Pour ajuster le graphique à la forme voulue, l’auteur a introduit le concept de headers
- La plupart des options utiles peuvent être contrôlées via les headers
- Après avoir ajouté des headers, il suffit d’appuyer sur
C-c C-cpour voir immédiatement le résultat - Un eplot mode existe aussi pour faciliter cela
- Après avoir ajouté des headers, il suffit d’appuyer sur
- Un exemple simple est fourni sous la forme d’un petit graphique, et la plupart des variantes montrées dans la première image de l’article sont elles aussi produites via des headers
État de publication et travail restant
- L’auteur a rédigé un
README.mddocumentant différentes possibilités - Le code est publié sur Microsoft Github
- Dans son état actuel, il s’agit toujours d’un work in progress
- Le paquet semble déjà pouvoir être utile dans une certaine mesure, mais comme il a été écrit et modifié en continu pendant une semaine, il est difficile d’en garantir la stabilité
- Le code a été écrit de manière inefficace en fonction des cas de test et nécessite une réorganisation
- Plusieurs chemins de code doivent être unifiés
- La lisibilité du code doit être améliorée
- L’auteur l’a poussé en l’état pour faire une pause, mais les utilisateurs réels doivent encore rester prudents
1 commentaires
Avis sur Hacker News
Comme j’aime bien ce domaine, j’ajoute un conseil général : quand je travaillais comme ingénieur sur la bibliothèque Grapher de Our World in Data (https://github.com/owid/owid-grapher) avec Max Roser et Hannah Ritchie, j’ai beaucoup appris sur la manière de faire de bons graphiques.
En regardant les exemples, je dirais qu’il ne faut pas négliger le titre, le sous-titre et la légende. Comme vous avez déjà prévu un « en-tête simple », cela devrait être facile à bien intégrer, et quelques courtes phrases peuvent faire une grande différence. Je recommande aussi “Storytelling with Data” de Cole Nussbaumer Knaflic.
Si vous continuez à le faire évoluer, vous aurez sans doute envie un jour d’y ajouter une bibliothèque de flux de données et un DSL. Le dplyr de Hadley Wickham pour R était excellent, et je m’en suis inspiré aussi dans mon outil Ohayo et dans la bibliothèque CoreTable d’OWID Grapher (https://github.com/owid/owid-grapher/tree/master/packages/%4...). Arquero, la bibliothèque relativement récente de Jeffrey Heer (https://idl.uw.edu/arquero/), relève aussi de cette famille.
Ces derniers temps, je regarde le nouvel outil Plot de Mike Bostock (https://observablehq.com/plot/). Je ne l’ai encore utilisé qu’un jour ou deux, mais il est prometteur. Je n’utilise pas Emacs en ce moment, mais j’espère que tout cela sera utile.
Par exemple, on peut être en train de générer un fichier de données et ne pas vouloir le modifier manuellement avant de tracer le graphique, ou vouloir visualiser au fil de l’eau des fichiers dans un grand répertoire de données sans ajouter à la main un en-tête à chacun.
Comme le dit l’article, on risque fort de se retrouver avec plus de code nécessaire que si l’on implémentait directement ce dont on a besoin.
Si l’on veut changer la taille des graduations de troisième niveau sur l’axe Y, on appelle quelque chose comme
set_third_level_y_ticks(). Ce n’est pas forcément mauvais, et c’est peut-être inévitable, mais tout donne l’impression d’être traité comme un cas particulier, avec un manque d’orthogonalité.Cela dit, je respecte la tentative de construire quelque chose en pur elisp.
Le fait que ces tracés soient en SVG, et donc exportables vers LaTeX ou un navigateur web, est aussi un gros avantage. Pour le premier cas, cela devient un candidat assez sérieux quand il faut produire des graphiques à insérer dans un article scientifique. Beau résultat.
Cela dit, Codeberg semble enfin commencer à gagner une certaine traction parmi les projets libres et open source.
Je viens d’ouvrir la page d’accueil de github.com et de chercher « Microsoft » avec Ctrl-F : 0 résultat.