En este módulo, aprenderemos a crear visualizaciones jerárquicas utilizando D3.js. Las visualizaciones jerárquicas son útiles para representar datos estructurados en niveles, como árboles genealógicos, organigramas y estructuras de carpetas.
Conceptos Clave
Antes de comenzar con los ejemplos prácticos, es importante entender algunos conceptos clave:
- Jerarquía: Una estructura de datos en la que los elementos están organizados en niveles, con un elemento raíz y varios niveles de nodos hijos.
- Nodo: Cada elemento en la jerarquía.
- Enlace: La conexión entre dos nodos, representando la relación padre-hijo.
Tipos de Diseños Jerárquicos en D3.js
D3.js proporciona varios tipos de diseños jerárquicos, entre los que se incluyen:
- Árbol (Tree Layout): Representa la jerarquía en una estructura de árbol.
- Cluster: Similar al árbol, pero con un enfoque en la agrupación de nodos.
- Treemap: Representa la jerarquía en un espacio rectangular, dividiendo el área en sub-rectángulos.
- Pack: Representa la jerarquía en un espacio circular, con círculos anidados.
Ejemplo Práctico: Creando un Árbol Jerárquico
Paso 1: Preparar los Datos
Primero, necesitamos definir nuestra estructura de datos jerárquica. Utilizaremos un formato JSON para representar la jerarquía.
{ "name": "Root", "children": [ { "name": "Child 1", "children": [ { "name": "Grandchild 1" }, { "name": "Grandchild 2" } ] }, { "name": "Child 2", "children": [ { "name": "Grandchild 3" } ] } ] }
Paso 2: Configurar el Entorno
Asegúrate de tener un archivo HTML con un contenedor SVG donde se renderizará el árbol.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hierarchical Layout</title> <script src="https://d3js.org/d3.v6.min.js"></script> <style> .node circle { fill: #999; } .node text { font: 12px sans-serif; } .link { fill: none; stroke: #555; stroke-width: 1.5px; } </style> </head> <body> <svg width="960" height="600"></svg> <script src="hierarchical-layout.js"></script> </body> </html>
Paso 3: Crear el Árbol en D3.js
En el archivo hierarchical-layout.js
, escribiremos el código para crear el árbol jerárquico.
// Definir las dimensiones y márgenes del SVG const width = 960; const height = 600; const margin = { top: 20, right: 120, bottom: 20, left: 120 }; // Crear un contenedor SVG const svg = d3.select("svg") .attr("width", width) .attr("height", height) .append("g") .attr("transform", `translate(${margin.left},${margin.top})`); // Crear un layout de árbol const treeLayout = d3.tree().size([height - margin.top - margin.bottom, width - margin.left - margin.right]); // Definir la raíz de los datos const root = d3.hierarchy(data); // Generar el árbol treeLayout(root); // Crear enlaces (links) const link = svg.selectAll(".link") .data(root.links()) .enter().append("path") .attr("class", "link") .attr("d", d3.linkHorizontal() .x(d => d.y) .y(d => d.x)); // Crear nodos const node = svg.selectAll(".node") .data(root.descendants()) .enter().append("g") .attr("class", "node") .attr("transform", d => `translate(${d.y},${d.x})`); // Añadir círculos a los nodos node.append("circle") .attr("r", 5); // Añadir etiquetas a los nodos node.append("text") .attr("dy", 3) .attr("x", d => d.children ? -8 : 8) .style("text-anchor", d => d.children ? "end" : "start") .text(d => d.data.name);
Explicación del Código
- Definir las Dimensiones y Márgenes: Configuramos el tamaño del SVG y los márgenes para el contenedor.
- Crear el Contenedor SVG: Añadimos un grupo (
<g>
) dentro del SVG para aplicar las transformaciones. - Crear el Layout de Árbol: Utilizamos
d3.tree()
para crear el layout de árbol y definimos su tamaño. - Definir la Raíz de los Datos: Convertimos los datos JSON en una jerarquía utilizando
d3.hierarchy()
. - Generar el Árbol: Aplicamos el layout de árbol a la jerarquía de datos.
- Crear Enlaces: Dibujamos las líneas que conectan los nodos utilizando
d3.linkHorizontal()
. - Crear Nodos: Añadimos grupos (
<g>
) para cada nodo y los posicionamos. - Añadir Círculos y Etiquetas: Dibujamos círculos y etiquetas de texto para cada nodo.
Ejercicio Práctico
Ejercicio 1: Añadir Colores a los Nodos
Modifica el código para que los nodos tengan diferentes colores según su nivel en la jerarquía.
Solución
// Añadir colores a los nodos según su nivel node.append("circle") .attr("r", 5) .style("fill", d => d.depth === 0 ? "#ff0000" : d.depth === 1 ? "#00ff00" : "#0000ff");
Ejercicio 2: Añadir Interactividad
Añade interactividad para que los nodos cambien de color cuando se haga clic en ellos.
Solución
// Añadir interactividad a los nodos node.append("circle") .attr("r", 5) .style("fill", d => d.depth === 0 ? "#ff0000" : d.depth === 1 ? "#00ff00" : "#0000ff") .on("click", function(event, d) { d3.select(this).style("fill", "#ff00ff"); });
Conclusión
En esta sección, hemos aprendido a crear visualizaciones jerárquicas utilizando D3.js, específicamente un árbol jerárquico. Hemos cubierto los conceptos clave, configurado el entorno, y creado un ejemplo práctico. Además, hemos proporcionado ejercicios para reforzar los conceptos aprendidos. En el próximo módulo, exploraremos otros tipos de diseños jerárquicos y cómo utilizarlos en nuestras visualizaciones.
D3.js: De Principiante a Avanzado
Módulo 1: Introducción a D3.js
Módulo 2: Trabajando con Selecciones
- Entendiendo las Selecciones
- Seleccionando Elementos del DOM
- Modificando Elementos
- Vinculando Datos a Elementos
Módulo 3: Datos y Escalas
- Cargando y Analizando Datos
- Usando Escalas de D3
- Escalas Lineales y Ordinales
- Escalas de Tiempo y Logarítmicas
Módulo 4: Creando Visualizaciones Básicas
- Creando Gráficos de Barras
- Creando Gráficos de Líneas
- Creando Gráficos de Pastel
- Creando Diagramas de Dispersión
Módulo 5: Visualizaciones Avanzadas
- Creando Diseños Jerárquicos
- Creando Diseños de Fuerza
- Creando Mapas Geográficos
- Creando Visualizaciones Personalizadas
Módulo 6: Interactividad y Animación
Módulo 7: Trabajando con Datos Reales
- Obteniendo Datos de APIs
- Limpieza y Transformación de Datos
- Integración con Otras Bibliotecas
- Estudios de Caso y Ejemplos
Módulo 8: Rendimiento y Optimización
- Optimizando el Rendimiento de D3.js
- Manejando Grandes Conjuntos de Datos
- Vinculación de Datos Eficiente
- Depuración y Solución de Problemas
Módulo 9: Mejores Prácticas y Técnicas Avanzadas
- Organización del Código y Modularidad
- Componentes Reutilizables
- Patrones Avanzados de D3.js
- Contribuyendo a la Comunidad de D3.js