Análisis a fondo de D3
(d3indepth.com)- D3 in Depth es un material de aprendizaje basado en D3 6 y 7 que aborda el proceso de crear visualizaciones de datos personalizadas con D3.js
- Se enfoca más en la creación de visualizaciones personalizadas que en el uso de gráficos simples, y también permite aprender los componentes que forman parte de la visualización web
- Las bases de HTML, SVG, CSS y JavaScript se conectan con el trabajo en D3, lo que ayuda a comprender la representación de datos en la web
- También se conecta con materiales sobre tableros e historias de datos usando React, Chart.js y Leaflet, creando así un recorrido de aprendizaje de visualización con JavaScript
- Para quienes quieran aprender D3 a fondo, puede servir como material introductorio y de profundización que combina comprensión conceptual y práctica
Alcance de D3 in Depth
- D3 in Depth está dirigido a las versiones 6 y 7 de D3
- Permite aprender a crear visualizaciones de datos personalizadas usando D3.js
- También cubre HTML, SVG, CSS y JavaScript como elementos básicos necesarios para crear visualizaciones web
Recursos de visualización con JavaScript para ver junto con este
- Data Dashboards with JavaScript aborda cómo crear tableros de datos usando React, Chart.js y Leaflet
- Visualising Data with JavaScript trata sobre cómo crear gráficos e historias de datos usando Chart.js, Leaflet, D3 y React
- Una reseña de un lector valora mucho este material entre los libros de D3 y considera que su contenido es claro, fácil de seguir y sólido en conceptos
1 comentarios
Opiniones de Hacker News
Es una librería construida sobre D3 que añade muchas convenciones y funciones de conveniencia para crear gráficas, charts y plots
Incluso más allá está Observable Framework[2], un generador de sitios estáticos para dashboards de visualización que soporta Plot, D3 y varias otras librerías
1: https://observablehq.com/plot/
2: https://observablehq.com/framework/
Para varios tipos de plots, a menudo en realidad es más fácil manipular directamente los datos SVG, y tampoco es tan difícil
Ojalá hubiera librerías o frameworks que hicieran más fácil manipular la salida SVG o canvas. Los cambios pequeños deberían ser muy fáciles, pero mientras más alto nivel es el framework, más difícil es salirse del camino marcado
La documentación está bastante bien, pero le falta una sección útil de referencia de API, así que no es tan fácil descubrir funcionalidades
Intento evitar al máximo crear gráficas con HTML5 canvas, así que estaría bien si hubiera una forma nueva de diseñarlas
Edit: al activar la aceleración por hardware se volvió más fluido, pero incluso en un Ryzen 9 sigue yendo peor de lo esperado
Si me pidieran resolver una ecuación diferencial parcial que no veo desde hace 10 años, creo que recuperaría el ritmo más rápido
También me parece que la documentación de referencia de D3 es realmente terrible
Aun así, ahora parece más estable. Empecé a entenderle mejor cuando dejé de usar solo D3 y comencé a escribir de forma más imperativa con Svelte+D3
Me resultó más fácil entender los elementos generados, en lugar de inspeccionarlos después en las herramientas de desarrollador
Este sitio ayuda para usar D3 junto con Svelte: https://svelte.recipes/
El 80% de lo que hago se parece más a aplicaciones, 10% a sistemas y 10% a análisis de datos, y a veces hago un notebook de Jupyter por dos semanas y luego no lo vuelvo a ver en dos meses
La mayoría de las librerías de plotting tienen muchas reglas arbitrarias que hay que memorizar, y por lo general incluyen varios lenguajes específicos de dominio pequeños. Es como si una cadena simple se interpretara de forma mucho más compleja que
atoiAdemás, desde mi punto de vista, hay cosas mal resueltas en varias áreas, como decidir el rango de los ejes o manejar cantidades enormes de puntos
D3 te obliga a hacer muchas cosas por ti mismo, pero la interfaz para hacerlo es conceptualmente intuitiva. En vez de usar código genérico ajeno, enorme y lleno de bugs, con una API que se siente como armar un barco dentro de una botella, prefiero hacer las cosas bien con D3.js
Es fácil usarlo mal, difícil de depurar y difícil de entender
Eso no significa que este problema tenga una solución fácil. Si tuviera que hacer gráficos basados en datos muy específicos, probablemente igual seguiría eligiendo D3
En realidad no parece justo comparar una API con ese estándar
Hay que evitar en lo posible código que sea difícil de entender incluso para quien lo escribió, y D3 es un ejemplo representativo de ese tipo de librería
Por ejemplo, si dibujas datos en el rango de 0 a 100 en una pantalla 1080p de 1920x1080, en algún momento tienes que decidir cómo escalar los datos para ajustarlos a la proyección en pantalla
Puedes hacer las cuentas tú mismo, o puedes dejar que una librería como D3 las haga
Aunque no dibujes datos en la web, tarde o temprano vas a terminar dibujándolos en alguna parte, y te servirá encontrar herramientas con el mismo papel en ese ecosistema
Si no recuerdo mal, tenía que escalar los rectángulos que iba a dibujar en la gráfica para ajustarlos al tamaño del PNG que estaba generando
Claro, era algo muy trivial y totalmente distinto de las cosas increíbles que puede hacer D3, pero fue una gran experiencia porque era la primera vez que hacía por mi cuenta algo que generaba imágenes en una computadora
Personalmente, D3 nunca me ha parecido intuitivo. Tal vez el problema es que intenta hacer demasiadas cosas en demasiados niveles de abstracción
Si solo se tratara de proyectar datos, sería fácil de entender, pero parece que la proyección también está muy ligada a los ejes y a otros elementos
Creo que lo que mbostock llama la abstracción central de D3,
selecty el cálculo de diferencias deselect, se parece más a una conveniencia para escribir unpaint()reentrante.Solo está adornado con que la sentencia de paint se expresa como una sentencia de builder, queda atada por sí misma dentro del alcance de
select, y puede dividirse para varios efectos.En particular, en los ejemplos de animación, es sorprendentemente poco lo que hace D3, y hay que encargarse uno mismo de usar un bucle externo y rastrear el estado en el tiempo.
D3 tampoco ofrece una abstracción para encapsular la visualización, ya sea como función o de otra forma, y esa parte queda como tarea para el lector.
Para los nuevos usuarios de D3, todo esto resulta una gran sorpresa o hasta un shock. Es parecido a introducir una base de datos nueva y encontrarte con que solo hay bibliotecas para entrada/salida de archivos, índices B-tree y optimizador de consultas, y que tienes que conectar todo tú mismo.
Es una forma de reemplazar con React el módulo de manipulación del DOM de D3,
d3-select. El hecho de que esto sea posible y funcione bien es una prueba de que el diseño de D3 es excelente.Según el objetivo, puede ser la herramienta necesaria o no.
Sigo usando varias funciones auxiliares, como easing o scaling, pero los componentes reales los hago con frameworks modernos. En mi caso, con Vue 3 y TypeScript.
Aun así, agradezco a D3.js por la época tan hermosa que me dio y por haberme enseñado muchas buenas prácticas de visualización de datos.
Los valores predeterminados y demos de Mike Bostock eran una fuente de inspiración y un buen ejemplo de estándares de calidad, y además encajaban muy bien con el minimalismo de Tufte.
D3 y jQuery se parecen hasta cierto punto, y ambos tienden a convertirse en código espagueti. Herramientas como VisX añaden mucha estructura sobre el D3 que usan y ayudan a mantener las cosas en un estado razonable.
Eso sí, me pregunto si se siente limitante, en el sentido de que para hacer algo más personalizado hay que pelearse con la herramienta más que cuando usas D3 puro.
Otra herramienta inspirada en GG es la muy apropiadamente llamada ggplot2, para el lenguaje R.
Ofrece una interfaz mucho más concisa y cercana a lo funcional, y además encaja muy bien con una herramienta poco común llamada Rush para crear gráficos rápidamente pasando CSV por un pipe, es decir, un one-liner de R para shell.
Estas herramientas normalmente dependen de funciones del navegador o usan soluciones torpes de renderizado del lado del servidor con navegadores headless para generar del lado servidor.
En particular, estaría bien poder generar diagramas de Venn de forma programática. Curiosamente, casi no hay nada en ese espacio.
Algunas bibliotecas de gráficos en JavaScript sí lo soportan, pero en general parece haber muy poco soporte.
gnuplot se ve bien, pero no tiene soporte para diagramas de Venn.
También es una dependencia de OpenSearch Dashboards, así que permite a los usuarios crear dashboards personalizados sobre logs y datos de observabilidad[2].
Parece que la biblioteca Vega puede aliviar hasta cierto punto los problemas de curva de aprendizaje de D3 que mencionan otras personas.
[1] https://vega.github.io/vega/docs/
[2] https://opensearch.org/docs/latest/dashboards/visualize/vega...