En este módulo, aprenderemos sobre dos tipos fundamentales de escalas en D3.js: las escalas lineales y las escalas ordinales. Las escalas son una parte crucial de D3.js, ya que nos permiten mapear datos a valores visuales, como posiciones en un gráfico, colores, tamaños, etc.
- Introducción a las Escalas
Las escalas en D3.js son funciones que mapean un dominio de entrada (valores de datos) a un rango de salida (valores visuales). Esto es esencial para crear visualizaciones precisas y efectivas.
1.1. Conceptos Clave
- Dominio (Domain): El conjunto de valores de entrada que la escala puede recibir.
- Rango (Range): El conjunto de valores de salida que la escala puede producir.
- Escala Lineal: Mapea un dominio continuo a un rango continuo.
- Escala Ordinal: Mapea un dominio discreto a un rango discreto.
- Escalas Lineales
Las escalas lineales son útiles cuando trabajamos con datos numéricos continuos. Estas escalas mapean un dominio de valores numéricos a un rango de valores numéricos de manera lineal.
2.1. Creando una Escala Lineal
Para crear una escala lineal en D3.js, utilizamos la función d3.scaleLinear()
. A continuación, se muestra un ejemplo básico:
// Crear una escala lineal const escalaLineal = d3.scaleLinear() .domain([0, 100]) // Dominio de entrada .range([0, 500]); // Rango de salida // Usar la escala para mapear un valor const valorMapeado = escalaLineal(50); // Resultado: 250 console.log(valorMapeado);
2.2. Explicación del Código
d3.scaleLinear()
: Crea una nueva escala lineal..domain([0, 100])
: Define el dominio de la escala, en este caso de 0 a 100..range([0, 500])
: Define el rango de la escala, en este caso de 0 a 500.escalaLineal(50)
: Mapea el valor 50 del dominio al rango, resultando en 250.
2.3. Ejemplo Práctico
Supongamos que queremos crear un gráfico de barras donde la altura de las barras se base en valores de datos. Utilizaremos una escala lineal para mapear los valores de datos a alturas de barras.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Gráfico de Barras con Escala Lineal</title> <script src="https://d3js.org/d3.v7.min.js"></script> </head> <body> <svg width="600" height="400"></svg> <script> const datos = [10, 20, 30, 40, 50]; const alturaMaxima = 300; const escalaLineal = d3.scaleLinear() .domain([0, d3.max(datos)]) .range([0, alturaMaxima]); const svg = d3.select("svg"); svg.selectAll("rect") .data(datos) .enter() .append("rect") .attr("x", (d, i) => i * 50) .attr("y", d => alturaMaxima - escalaLineal(d)) .attr("width", 40) .attr("height", d => escalaLineal(d)) .attr("fill", "steelblue"); </script> </body> </html>
2.4. Explicación del Código
d3.max(datos)
: Encuentra el valor máximo en el conjunto de datos.escalaLineal(d)
: Mapea cada valor de datos a una altura de barra.svg.selectAll("rect")
: Selecciona todos los elementosrect
en el SVG..data(datos)
: Vincula los datos a los elementosrect
..enter()
: Crea elementosrect
para cada dato..attr("x", (d, i) => i * 50)
: Define la posición horizontal de cada barra..attr("y", d => alturaMaxima - escalaLineal(d))
: Define la posición vertical de cada barra..attr("width", 40)
: Define el ancho de cada barra..attr("height", d => escalaLineal(d))
: Define la altura de cada barra..attr("fill", "steelblue")
: Define el color de las barras.
- Escalas Ordinales
Las escalas ordinales son útiles cuando trabajamos con datos categóricos. Estas escalas mapean un dominio de valores discretos a un rango de valores discretos.
3.1. Creando una Escala Ordinal
Para crear una escala ordinal en D3.js, utilizamos la función d3.scaleOrdinal()
. A continuación, se muestra un ejemplo básico:
// Crear una escala ordinal const escalaOrdinal = d3.scaleOrdinal() .domain(["A", "B", "C", "D"]) .range(["rojo", "verde", "azul", "naranja"]); // Usar la escala para mapear un valor const colorMapeado = escalaOrdinal("B"); // Resultado: "verde" console.log(colorMapeado);
3.2. Explicación del Código
d3.scaleOrdinal()
: Crea una nueva escala ordinal..domain(["A", "B", "C", "D"])
: Define el dominio de la escala, en este caso cuatro categorías..range(["rojo", "verde", "azul", "naranja"])
: Define el rango de la escala, en este caso cuatro colores.escalaOrdinal("B")
: Mapea la categoría "B" al color "verde".
3.3. Ejemplo Práctico
Supongamos que queremos crear un gráfico de barras donde el color de las barras se base en categorías. Utilizaremos una escala ordinal para mapear las categorías a colores.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Gráfico de Barras con Escala Ordinal</title> <script src="https://d3js.org/d3.v7.min.js"></script> </head> <body> <svg width="600" height="400"></svg> <script> const datos = [ {categoria: "A", valor: 10}, {categoria: "B", valor: 20}, {categoria: "C", valor: 30}, {categoria: "D", valor: 40} ]; const alturaMaxima = 300; const escalaLineal = d3.scaleLinear() .domain([0, d3.max(datos, d => d.valor)]) .range([0, alturaMaxima]); const escalaOrdinal = d3.scaleOrdinal() .domain(["A", "B", "C", "D"]) .range(["red", "green", "blue", "orange"]); const svg = d3.select("svg"); svg.selectAll("rect") .data(datos) .enter() .append("rect") .attr("x", (d, i) => i * 50) .attr("y", d => alturaMaxima - escalaLineal(d.valor)) .attr("width", 40) .attr("height", d => escalaLineal(d.valor)) .attr("fill", d => escalaOrdinal(d.categoria)); </script> </body> </html>
3.4. Explicación del Código
d3.max(datos, d => d.valor)
: Encuentra el valor máximo en el conjunto de datos.escalaLineal(d.valor)
: Mapea cada valor de datos a una altura de barra.escalaOrdinal(d.categoria)
: Mapea cada categoría a un color.svg.selectAll("rect")
: Selecciona todos los elementosrect
en el SVG..data(datos)
: Vincula los datos a los elementosrect
..enter()
: Crea elementosrect
para cada dato..attr("x", (d, i) => i * 50)
: Define la posición horizontal de cada barra..attr("y", d => alturaMaxima - escalaLineal(d.valor))
: Define la posición vertical de cada barra..attr("width", 40)
: Define el ancho de cada barra..attr("height", d => escalaLineal(d.valor))
: Define la altura de cada barra..attr("fill", d => escalaOrdinal(d.categoria))
: Define el color de las barras.
- Ejercicios Prácticos
Ejercicio 1: Crear una Escala Lineal
Crea una escala lineal que mapee un dominio de [0, 200] a un rango de [0, 1000]. Usa esta escala para mapear el valor 150.
Solución:
const escalaLineal = d3.scaleLinear() .domain([0, 200]) .range([0, 1000]); const valorMapeado = escalaLineal(150); // Resultado: 750 console.log(valorMapeado);
Ejercicio 2: Crear una Escala Ordinal
Crea una escala ordinal que mapee las categorías ["X", "Y", "Z"] a los colores ["purple", "yellow", "cyan"]. Usa esta escala para mapear la categoría "Y".
Solución:
const escalaOrdinal = d3.scaleOrdinal() .domain(["X", "Y", "Z"]) .range(["purple", "yellow", "cyan"]); const colorMapeado = escalaOrdinal("Y"); // Resultado: "yellow" console.log(colorMapeado);
- Conclusión
En esta lección, hemos aprendido sobre las escalas lineales y ordinales en D3.js. Las escalas son herramientas poderosas que nos permiten mapear datos a valores visuales de manera efectiva. Hemos visto cómo crear y utilizar estas escalas con ejemplos prácticos y ejercicios. En el próximo módulo, exploraremos cómo crear visualizaciones básicas utilizando estas escalas y otros conceptos de D3.js.
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