Tema 05 — D3.js. Escalando y dibujando ejes de un gráfico
Voz generada por IA (ElevenLabs Matilda) basada en la guía de estudio narrada. Tu celular puede reproducir este audio mientras lees, o mientras haces otras cosas.
TL;DR: Escalar correctamente en D3 permite traducir datos a píxeles con fidelidad y añadir ejes que hagan legible la visualización.
Puntos clave:
- Las escalas en D3 son funciones que conectan un dominio de entrada con un rango de salida. En la práctica, convierten valores de datos en posiciones, tamaños o distancias dentro del SVG.
- Escalar no es solo un ajuste técnico: afecta directamente a la veracidad de la visualización. Una escala mal definida puede reforzar interpretaciones erróneas de los datos.
- En escalas lineales, el
input domainviene de los datos y eloutput rangelo define quien diseña la visualización. Por ejemplo, valores de ventas de manzanas pueden traducirse a alturas entre 10px y 350px. - D3 permite calcular automáticamente máximos con
d3.max, evitando fijar manualmente los límites del dominio. Esto hace que el gráfico se adapte cuando cambia el dataset. - En un scatter plot, las coordenadas deben pasar por
xScaleeyScaleantes de dibujarse. Para el eje Y, el rango suele invertirse con.range([h, 0])porque el SVG crece hacia abajo. - Los ejes se construyen con
d3.svg.axis(), se vinculan a una escala y se insertan en el SVG mediante.call(axis). Luego pueden posicionarse contransformy estilizarse con CSS. - Las escalas ordinales sirven para categorías discretas, no para valores continuos. En un bar chart, permiten distribuir barras según el orden del array y calcular automáticamente el ancho de cada banda.
- Funciones como
.ticks(5),.rangeBand()y.rangeRoundBands()ayudan a controlar la legibilidad del gráfico: número de divisiones, ancho de barras y separación visual.
Términos técnicos clave: D3.js, escalas, dominio de entrada, rango de salida, normalización, escala lineal, d3.max, scatter plot, SVG, ejes, escala ordinal, rangeRoundBands
Fórmulas, procesos o ejemplos relevantes:
- Proceso para crear una escala lineal:
- Crear la función con
d3.scale.linear(). - Definir el dominio con
.domain([mínimo, máximo]). - Definir el rango visual con
.range([mínimo_px, máximo_px]). - Aplicar la escala al dibujar:
xScale(d[0])oyScale(d[1]).
- Crear la función con
- Ejemplo de normalización visual: valores de manzanas entre 100 y 500 pueden representarse dentro de un rango de 10px a 350px, evitando que el gráfico crezca sin control.
- Proceso para escalar un scatter plot:
- Calcular el máximo de X con
d3.max(dataset, function(d) { return d[0]; }). - Calcular el máximo de Y con
d3.max(dataset, function(d) { return d[1]; }). - Crear
xScalecon.range([0, w]). - Crear
yScalecon.range([h, 0]). - Sustituir coordenadas directas por coordenadas escaladas.
- Calcular el máximo de X con
- Ajuste de márgenes:
- Definir
marginxymarginy. - Usar
.range([0 + marginx, w - marginx])para X. - Usar
.range([h - marginy, 0 + marginy])para Y.
- Definir
- Proceso para crear un eje:
- Crear el eje con
d3.svg.axis(). - Asociarlo a una escala con
.scale(xScale). - Definir orientación con
.orient("bottom")o.orient("left"). - Insertarlo con
svg.append("g").call(axis). - Posicionarlo con
transform, por ejemplotranslate(0, h - padding).
- Crear el eje con
- Cálculo de bandas en escala ordinal:
- Ancho total:
600. - Número de elementos:
12. - Cálculo:
(600 - 0) / 12 = 50. - Cada barra ocupa una banda de 50px antes de aplicar separación visual.
- Ancho total:
Resumen narrativo
Sección titulada «Resumen narrativo»El tema introduce un cambio importante en la forma de trabajar con D3.js: pasar de dibujar formas directamente a construir visualizaciones escaladas. Hasta ahora, los valores podían convertirse casi de manera inmediata en píxeles, pero ese enfoque deja de ser suficiente cuando los datos crecen, cambian o necesitan ajustarse a un espacio visual concreto. La escala aparece entonces como una función intermedia que traduce datos en representación gráfica.
La idea central es que una escala relaciona un dominio de entrada con un rango de salida. El dominio corresponde a los valores reales del dataset, mientras que el rango corresponde al espacio disponible en la visualización. El ejemplo de las manzanas lo muestra con claridad: si cada valor se transforma directamente en píxeles, un crecimiento mensual puede hacer que las barras se salgan del gráfico. Al definir un rango, el diseñador controla el espacio visual sin alterar la relación proporcional entre los datos.
Esta operación tiene una dimensión técnica, pero también interpretativa. El material insiste en que una mala escala puede producir una imagen incorrecta de los datos y, por tanto, validar hipótesis equivocadas. La referencia a la percepción humana recuerda que las visualizaciones no son neutrales: orientan la lectura. Por eso, normalizar y escalar no debe entenderse como un simple ajuste de diseño, sino como una condición para representar los datos con fidelidad.
En el caso del scatter plot, D3 permite automatizar parte del trabajo mediante funciones como d3.max, que calculan los límites del dominio a partir del dataset. Así, en lugar de escribir manualmente el valor máximo de X o Y, se obtiene desde los propios datos. Luego, cada coordenada se dibuja pasando por xScale o yScale, lo que adapta el gráfico al tamaño del SVG. Un detalle clave es invertir el rango del eje Y, porque en SVG el origen está arriba y los valores positivos descienden visualmente.
Una vez escalado el gráfico, el tema añade los ejes. Los ejes no son solo elementos decorativos: permiten leer el gráfico, ubicar los valores y entender la magnitud de lo representado. En D3 se crean con d3.svg.axis(), se asocian a una escala y se insertan en un grupo SVG. Después pueden moverse con transform, por ejemplo para colocar el eje X en la parte inferior, y estilizarse con CSS específico para SVG.
Finalmente, el tema distingue entre escalas lineales y ordinales. Las lineales sirven para valores continuos, mientras que las ordinales organizan categorías discretas, como calificaciones o respuestas de cuestionario. En un bar chart, una escala ordinal permite respetar el orden del array y repartir automáticamente las barras en bandas. Funciones como rangeRoundBands y rangeBand simplifican el cálculo del ancho y la separación, haciendo que el código sea más claro y adaptable.
Para profundizar
Sección titulada «Para profundizar»- Replicar el scatter plot escalado del tema y modificar manualmente el
rangepara observar cómo cambia la distribución visual. - Practicar el uso de
d3.maxcon datasets formados por arrays dentro de arrays, calculando máximos para X e Y. - Experimentar con
.ticks(5)en los ejes para comparar distintos niveles de división y legibilidad. - Quitar el parámetro
0.05derangeRoundBands([0, w], 0.05)y observar cómo cambia la separación entre barras. - Revisar los apartados “Interactive Data Visualization for the Web”, “Setting up the Axes”, “Labelling multiple lines on a graph” y “How to rotate the text labels for the x Axis” incluidos en el material del tema.
Transcripción de la clase aún no disponible. Se publicará cuando la lección magistral correspondiente esté procesada.
PDF original del Tema 05 (UNIR). Abrir en pestaña nueva.