- eplot es un paquete para dibujar gráficos simples a partir de datos numéricos dentro de Emacs, nacido a partir de las limitaciones en la visualización de ejes y la usabilidad de la combinación de
chart.ely Org/Gnuplot - La mayor preocupación son las marcas del eje Y, que deben manejar de forma natural números agradables de las series 1, 2 y 5, además de escalas extremas e intervalos de tiempo
- Al trasladar a Emacs Lisp la experiencia de una biblioteca de gráficos previa en PHP, se implementaron expresiones basadas en SVG, como gradientes y modo oscuro, aunque se dejaron fuera algunos efectos que requieren procesamiento a nivel de píxel
- Al ejecutar
M-x eploten un búfer con muchos números, se abre un búfer de gráfico, y con headers yC-c C-cse puede cambiar rápidamente la configuración y ver el resultado - El código está publicado en GitHub, pero es código en desarrollo escrito rápidamente durante una semana con foco en casos de prueba, por lo que aún falta ordenar rutas de código y mejorar la legibilidad
Por qué dibujar gráficos directamente dentro de Emacs
- Después de buscar durante mucho tiempo una forma sencilla de crear gráficos simples, al escribir un artículo sobre calificaciones de películas probé el
chart.elintegrado en Emacs chart.elviene incluido en Emacs, pero como originalmente nació como una herramienta de prueba deeieio, su alcance de uso es limitado- En general podía hacer lo que necesitaba, pero en particular la visualización del eje Y no resultaba satisfactoria
Las marcas de los ejes determinan la calidad del gráfico
- Una mala visualización de los ejes se nota mucho, pero para que se vea natural en la práctica hay que tratar con cuidado varios casos límite
- Google Finance también usaba antes un eje poco natural, poniendo el valor más alto como marca superior del eje Y y agregando líneas a intervalos iguales hacia el origen
- Recuerdo que esos gráficos existieron hasta alrededor de 2021
- Después, al reimplementar todo el sitio, pasó a tener ejes mejores
- Alrededor de 1997, mientras trabajaba en una corredora de bolsa, implementé una biblioteca de gráficos
- El problema de las marcas de los ejes no es tanto un problema matemático difícil, sino más bien uno de elegir con cuidado números agradables y rangos excepcionales
- Los números agradables suelen ser varias escalas de 1, 2 y 5
- En gráficos bursátiles pueden aparecer rangos como
$0.00001a$0.00002, o1e9a1e10 - En el eje temporal hay que considerar años, semestres, trimestres, meses, semanas e incluso casos donde se divide un mes por semanas
Puntos donde es difícil usar herramientas existentes tal cual
- La biblioteca de gráficos en PHP que había creado antes es cómoda para generar resultados en un servidor web, pero no encaja para experimentar manipulando números dentro de Emacs
- Como muestra la popularidad de Excel y Jupyter Notebook, es importante el proceso de ajustar datos de forma interactiva para acercarse al gráfico deseado
- Org también ofrece funciones de trazado, pero Org plot usa Gnuplot como backend
- Aunque Gnuplot en general es bastante usable, puede volverse pesado cuando se quiere cambiar valores predeterminados, como el formato de los números del eje Y en los ejemplos
Implementación de eplot y funciones visuales
- Como el nombre
chartya estaba en uso, el nuevo paquete se llamó eplot - No tenía pensado trasladar todas las funciones de la biblioteca PHP existente, pero al empezar la implementación terminé recreando la mayor parte
- La nueva versión también incluye funciones como modo oscuro
- Recuerdo que los gradientes de la biblioteca PHP estaban hechos a mano, e incluso incluían cosas como recursos de mapas de color para GIF
- La versión en Emacs Lisp usa SVG
- Como SVG admite gradientes, combina polígonos y gradientes para lograr un efecto similar
- Se puede obtener un resultado parecido al original en PHP
- No se implementó otro gradiente inusual
- Es difícil porque requiere una implementación a nivel de píxel, o al menos a nivel de línea
- Podría requerir cálculos matemáticos, así que se dejó fuera
Flujo de uso y forma de configuración
- Al ejecutar
M-x eploten un búfer que contiene muchos números, se muestra un gráfico en un búfer separado - Para ajustar el gráfico a la forma deseada, se introdujo el concepto de headers
- La mayoría de las opciones útiles se pueden controlar con headers
- Después de agregar headers, al presionar
C-c C-cse puede ver el resultado de inmediato - También existe un modo eplot para facilitar esto
- Después de agregar headers, al presionar
- Los ejemplos simples se ofrecen como gráficos mostrados en formato pequeño, y la mayoría de las variantes que aparecen en la primera imagen del artículo también se hicieron con headers
Estado público y trabajo pendiente
- Se escribió un
README.mdque documenta diversas posibilidades - El código está publicado en Microsoft Github
- El estado actual sigue siendo work in progress
- Básicamente creo que puede ser útil en cierta medida, pero como fue escrito mientras se corregía continuamente durante una semana, es difícil asegurar su estabilidad
- El código fue escrito de manera ineficiente según cada caso de prueba y está en un estado que necesita limpieza
- Hay que unificar varias rutas de código
- Hay que mejorar la legibilidad del código
- Por ahora se subió en su estado actual para tomar un descanso, y los usuarios reales todavía deben tener cuidado
1 comentarios
Opiniones en Hacker News
Como me gusta este tema, agrego un consejo general: antes trabajé como ingeniero en la biblioteca Grapher de Our World in Data (https://github.com/owid/owid-grapher) junto con Max Roser y Hannah Ritchie, y aprendí mucho sobre cómo hacer buenos gráficos.
Viendo los ejemplos, recomendaría no descuidar el título, el subtítulo y el pie de figura. Como ya tienen un “encabezado simple”, debería ser fácil incorporarlos bien, y unas pocas frases breves hacen una gran diferencia. También recomiendo “Storytelling with Data”, de Cole Nussbaumer Knaflic.
Si lo siguen desarrollando, algún día seguramente querrán incorporar también una biblioteca de flujo de datos y un DSL. dplyr, de Hadley Wickham en R, era lo mejor, y también tomé inspiración de ese enfoque en mi herramienta Ohayo y en la biblioteca CoreTable de OWID Grapher (https://github.com/owid/owid-grapher/tree/master/packages/%4...). Arquero (https://idl.uw.edu/arquero/), una biblioteca relativamente nueva de Jeffrey Heer, también va por una línea similar.
Últimamente estuve mirando Plot (https://observablehq.com/plot/), la nueva herramienta de Mike Bostock; apenas la usé un día o dos, pero promete. Ahora no uso Emacs, pero espero que lo anterior sirva.
Por ejemplo, puede que uno esté generando un archivo de datos y no quiera editarlo manualmente antes de graficar, o que quiera ir graficando archivos cuando haga falta en un directorio grande de datos sin agregar encabezados a mano en cada archivo.
Como dice el artículo original, probablemente termine siendo un caso en el que la cantidad de código necesaria sea mayor que implementarlo directamente.
Si quieres cambiar el tamaño de la marca de tercer nivel del eje Y, llamas algo como
set_third_level_y_ticks(). No digo que sea necesariamente malo, y tal vez no haya otra forma, pero da la sensación de que todo está tratado como un caso especial y de que le falta ortogonalidad.Aun así, respeto el intento de construir algo en elisp puro.
También es importante que estos plots sean SVG, porque se pueden llevar a LaTeX o a un navegador web. Eso primero los vuelve una opción bastante fuerte para crear gráficos que haya que insertar en un paper. Buen trabajo.
Aun así, parece que Codeberg por fin está ganando algo de tracción entre los proyectos de software libre y open source.
Acabo de abrir la página principal de github.com y busqué “Microsoft” con Ctrl-F: 0 resultados.