Els gràfics de dispersió són una eina poderosa per visualitzar la relació entre dues variables numèriques. En aquest tema, aprendrem a crear un gràfic de dispersió utilitzant D3.js, des de la preparació de les dades fins a la personalització del gràfic.
Objectius
- Entendre la utilitat dels gràfics de dispersió.
- Aprendre a carregar i preparar les dades.
- Crear un gràfic de dispersió bàsic amb D3.js.
- Personalitzar el gràfic amb estils i interactivitat.
- Preparant les Dades
Abans de crear el gràfic, necessitem tenir les dades preparades. Suposem que tenim un conjunt de dades en format CSV amb les següents columnes: x
i y
.
Exemple de Dades (data.csv)
- Configurant l'Entorn
Assegura't de tenir un fitxer HTML amb l'estructura bàsica i inclou la llibreria D3.js.
Estructura HTML
<!DOCTYPE html> <html lang="ca"> <head> <meta charset="UTF-8"> <title>Gràfic de Dispersió amb D3.js</title> <script src="https://d3js.org/d3.v7.min.js"></script> <style> .dot { fill: steelblue; stroke: black; } </style> </head> <body> <svg width="600" height="400"></svg> <script src="scatter-plot.js"></script> </body> </html>
- Creant el Gràfic de Dispersió
Pas 1: Carregar les Dades
Utilitzarem d3.csv
per carregar les dades des del fitxer CSV.
d3.csv("data.csv").then(data => { data.forEach(d => { d.x = +d.x; d.y = +d.y; }); createScatterPlot(data); });
Pas 2: Configurar les Escales
Definirem les escales per mapejar les dades a les coordenades del gràfic.
const width = 600; const height = 400; const margin = { top: 20, right: 30, bottom: 30, left: 40 }; const x = d3.scaleLinear() .domain([0, d3.max(data, d => d.x)]) .range([margin.left, width - margin.right]); const y = d3.scaleLinear() .domain([0, d3.max(data, d => d.y)]) .range([height - margin.bottom, margin.top]);
Pas 3: Crear els Eixos
Afegirem els eixos X i Y al gràfic.
const svg = d3.select("svg"); svg.append("g") .attr("transform", `translate(0,${height - margin.bottom})`) .call(d3.axisBottom(x)); svg.append("g") .attr("transform", `translate(${margin.left},0)`) .call(d3.axisLeft(y));
Pas 4: Afegir els Punts de Dades
Utilitzarem cercles SVG per representar cada punt de dades.
svg.append("g") .selectAll("circle") .data(data) .enter().append("circle") .attr("class", "dot") .attr("cx", d => x(d.x)) .attr("cy", d => y(d.y)) .attr("r", 5);
Codi Complet (scatter-plot.js)
d3.csv("data.csv").then(data => { data.forEach(d => { d.x = +d.x; d.y = +d.y; }); createScatterPlot(data); }); function createScatterPlot(data) { const width = 600; const height = 400; const margin = { top: 20, right: 30, bottom: 30, left: 40 }; const x = d3.scaleLinear() .domain([0, d3.max(data, d => d.x)]) .range([margin.left, width - margin.right]); const y = d3.scaleLinear() .domain([0, d3.max(data, d => d.y)]) .range([height - margin.bottom, margin.top]); const svg = d3.select("svg"); svg.append("g") .attr("transform", `translate(0,${height - margin.bottom})`) .call(d3.axisBottom(x)); svg.append("g") .attr("transform", `translate(${margin.left},0)`) .call(d3.axisLeft(y)); svg.append("g") .selectAll("circle") .data(data) .enter().append("circle") .attr("class", "dot") .attr("cx", d => x(d.x)) .attr("cy", d => y(d.y)) .attr("r", 5); }
- Personalització i Interactivitat
Afegir Estils
Podem personalitzar els punts canviant els estils CSS.
Afegir Interactivitat
Podem afegir interactivitat, com ara mostrar informació addicional quan es passa el ratolí per sobre d'un punt.
svg.append("g") .selectAll("circle") .data(data) .enter().append("circle") .attr("class", "dot") .attr("cx", d => x(d.x)) .attr("cy", d => y(d.y)) .attr("r", 5) .on("mouseover", function(event, d) { d3.select(this).attr("r", 7); // Mostrar informació addicional }) .on("mouseout", function(event, d) { d3.select(this).attr("r", 5); // Amagar informació addicional });
Exercici Pràctic
Exercici
Crea un gràfic de dispersió utilitzant un conjunt de dades diferent. Prova d'afegir interactivitat per mostrar les coordenades x
i y
quan es passa el ratolí per sobre d'un punt.
Solució
d3.csv("new_data.csv").then(data => { data.forEach(d => { d.x = +d.x; d.y = +d.y; }); createScatterPlot(data); }); function createScatterPlot(data) { const width = 600; const height = 400; const margin = { top: 20, right: 30, bottom: 30, left: 40 }; const x = d3.scaleLinear() .domain([0, d3.max(data, d => d.x)]) .range([margin.left, width - margin.right]); const y = d3.scaleLinear() .domain([0, d3.max(data, d => d.y)]) .range([height - margin.bottom, margin.top]); const svg = d3.select("svg"); svg.append("g") .attr("transform", `translate(0,${height - margin.bottom})`) .call(d3.axisBottom(x)); svg.append("g") .attr("transform", `translate(${margin.left},0)`) .call(d3.axisLeft(y)); svg.append("g") .selectAll("circle") .data(data) .enter().append("circle") .attr("class", "dot") .attr("cx", d => x(d.x)) .attr("cy", d => y(d.y)) .attr("r", 5) .on("mouseover", function(event, d) { d3.select(this).attr("r", 7); // Mostrar informació addicional svg.append("text") .attr("id", "tooltip") .attr("x", x(d.x) + 10) .attr("y", y(d.y) - 10) .text(`(${d.x}, ${d.y})`); }) .on("mouseout", function(event, d) { d3.select(this).attr("r", 5); // Amagar informació addicional svg.select("#tooltip").remove(); }); }
Conclusió
En aquest tema, hem après a crear un gràfic de dispersió bàsic amb D3.js, a carregar i preparar les dades, a configurar les escales i els eixos, i a afegir punts de dades al gràfic. També hem vist com personalitzar el gràfic amb estils i afegir interactivitat. Amb aquests coneixements, estàs preparat per crear gràfics de dispersió més complexos i personalitzats segons les teves necessitats.
D3.js: De Principiant a Avançat
Mòdul 1: Introducció a D3.js
Mòdul 2: Treballant amb Seleccions
Mòdul 3: Dades i Escales
- Carregant i Analitzant Dades
- Utilitzant Escales de D3
- Escales Lineals i Ordinals
- Escales de Temps i Logarítmiques
Mòdul 4: Creant Visualitzacions Bàsiques
- Creant Gràfics de Barres
- Creant Gràfics de Línies
- Creant Gràfics de Pastís
- Creant Gràfics de Dispersió
Mòdul 5: Visualitzacions Avançades
- Creant Disposicions Jeràrquiques
- Creant Disposicions de Força
- Creant Mapes Geo
- Creant Visualitzacions Personalitzades
Mòdul 6: Interactivitat i Animació
Mòdul 7: Treballant amb Dades Reals
- Recuperant Dades d'APIs
- Neteja i Transformació de Dades
- Integració amb Altres Llibreries
- Estudis de Cas i Exemples
Mòdul 8: Rendiment i Optimització
- Optimitzant el Rendiment de D3.js
- Gestionant Grans Conjunts de Dades
- Enllaç de Dades Eficient
- Depuració i Resolució de Problemes
Mòdul 9: Millors Pràctiques i Tècniques Avançades
- Organització del Codi i Modularitat
- Components Reutilitzables
- Patrons Avançats de D3.js
- Contribuint a la Comunitat de D3.js