svg = {
const totalWidth = window.innerWidth;
const height = 40;
const values = [insicurezza, panico, indignazione, sfiducia, noia];
const maxValues = [30, 30, 20, 10, 10];
const svg = d3.create("svg").attr("width", totalWidth).attr("height", height);
svg.append("rect")
.attr("x", 0)
.attr("y", 0)
.attr("width", totalWidth)
.attr("height", height)
.attr("fill", "#ffffff")
.attr("stroke", "transparent");
const totalValue = values.reduce((acc, val, i) => acc + (val / maxValues[i]), 0);
const colors = [
"#004639",
"#007c5f",
"#009c7a",
"#00b494",
"#00ccaa"
];
const totalMaxValue = maxValues.reduce((acc, val) => acc + val, 0);
let xOffset = 0;
// Se i rettangoli già esistono, li aggiorniamo, altrimenti li creiamo
const bars = svg.selectAll(".bar")
.data(values);
// Aggiungi i nuovi rettangoli, se non esistono
bars.enter().append("rect")
.attr("class", "bar")
.attr("x", 0) // Inizialmente partiamo dalla posizione più a sinistra
.attr("y", 0)
.attr("height", height) // Altezza fissa
.attr("width", 0) // Imposta inizialmente la larghezza a 0
.attr("fill", (d, i) => colors[i])
.style("opacity", 0) // Imposta inizialmente l'opacità a 0 per l'animazione di dissolvenza
.transition() // Inizia la transizione
.duration(1000) // Durata dell'animazione (1 secondo)
.style("opacity", 1) // Rende il rettangolo visibile (opacità a 1)
.attr("width", (d, i) => (d / totalMaxValue) * totalWidth) // Calcola la larghezza proporzionale
.attr("x", (d, i) => {
const width = (d / totalMaxValue) * totalWidth;
const offset = xOffset; // La posizione di partenza lungo l'asse x
xOffset += width; // Aumentiamo l'offset per il prossimo rettangolo
return offset; // Posiziona il rettangolo adiacente
});
// Aggiorna i rettangoli esistenti con la transizione
bars.transition()
.duration(1000) // Durata della transizione
.attr("width", (d, i) => (d / totalMaxValue) * totalWidth) // Calcola la nuova larghezza proporzionale
.attr("x", (d, i) => {
const width = (d / totalMaxValue) * totalWidth;
const offset = xOffset; // La posizione di partenza lungo l'asse x
xOffset += width; // Aumentiamo l'offset per il prossimo rettangolo
return offset; // Posiziona il rettangolo adiacente
});
// Rimuovi i rettangoli che non sono più necessari (se qualche valore è diminuito)
bars.exit()
.transition()
.duration(1000)
.style("opacity", 0) // Rende il rettangolo invisibile
.remove();
// Restituisce l'elemento SVG creato
return svg.node();
}