1 puntos por GN⁺ 2024-06-28 | 1 comentarios | Compartir por WhatsApp
  • 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.el y 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 eplot en un búfer con muchos números, se abre un búfer de gráfico, y con headers y C-c C-c se 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.el integrado en Emacs
  • chart.el viene incluido en Emacs, pero como originalmente nació como una herramienta de prueba de eieio, 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.00001 a $0.00002, o 1e9 a 1e10
    • 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 chart ya 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 eplot en 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-c se puede ver el resultado de inmediato
    • También existe un modo eplot para facilitar esto
  • 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.md que 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

 
GN⁺ 2024-06-28
Opiniones en Hacker News
  • ¡Impecable! La forma en que incorporaron el gradiente es simple y a la vez ingeniosa.
    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.
  • Así que por eso últimamente no encontraba el artículo de “corregir el 10% de los bugs de Emacs”. Resulta que estaba haciendo esto. Genial; es un verdadero maestro de Emacs.
  • ¡Se ve muy bien! Usar la función de variables locales de archivo y directorio de Emacs para la configuración de los gráficos podría dar una experiencia de usuario más flexible.
    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.
  • Al graficar en org mode también se puede usar Python y matplotlib. No solo se puede con Gnuplot.
    • Matplotlib ya tiene una API bastante incómoda, y no creo que ponerle encima un wrapper en elisp vaya a convertirla en algo agradable de usar.
      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.
    • Lo que siempre me molesta de matplotlib y gnuplot es que parece haber un comando o una llamada a función separada literalmente para todo.
      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.
    • También existe ESS (Emacs Speaks Statistics). Integra fuertemente R/Julia con org-mode, así que se pueden usar cosas como ggplot2 o makie.
      Aun así, respeto el intento de construir algo en elisp puro.
    • También se pueden usar R y sus bibliotecas de gráficos.
  • Es un hack bien hecho. Me gusta especialmente la parte del gradiente.
    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.
  • Es la primera vez que veo las dos palabras “Microsoft Github” juntas de forma tan explícita y, aunque ya hayan pasado años desde que se volvió cierto, me da una sensación incómoda.
    • Todavía no entiendo que tantos proyectos de software libre y open source usen esa plataforma. GitHub tuvo muchísimo éxito en hacer que la gente no vea el prefijo Microsoft.
      Aun así, parece que Codeberg por fin está ganando algo de tracción entre los proyectos de software libre y open source.
    • Por eso parece que GitHub todavía intenta verse como la startup independiente de antes. Muchos desarrolladores independientes sienten algo parecido y se inclinan más por valores de libertad del software que por el valor para accionistas o el capitalismo de las big tech.
      Acabo de abrir la página principal de github.com y busqué “Microsoft” con Ctrl-F: 0 resultados.
    • Tuve exactamente la misma reacción. Espero que algún día no lo renombren a MS GitHub.