Published
Edited
Jan 31, 2022
2 stars
Insert cell
# Rings
Insert cell
Use of rotate and skew transformations to expand a set of concentric circles
Insert cell
{
const width = 900
const height = 420
const svg = d3.create('svg')
.attr("width",width)
.attr("height",height);
const group = svg.append("g")

const dataone = [20, 25, 28, 35, 50, 60, 75, 90, 95, 100]
const position = 100
group
.append('line')
.attr("x1", 100)
.attr("y1", 132)
.attr("x2", 950)
.attr("y2", 408)
.attr("stroke-width", 2.)
.style("stroke-dasharray", ("2,8"))
.attr("stroke", "#ddd");

let graph;
for (let lev = 0; lev < position; lev++) {

let graph = group.append("g")
.attr("transform", function () {
const reverse = 0
return "translate(" + (100 + reverse * 8) + "," + (130 + reverse * 2) +
")rotate(315)skewX(-45)skewY(10)translate(" + -reverse * 5 + "," +
-reverse * 2 + ")scale(.5)";})
.attr("id", "spot_" + lev)
}

for (let i = 0; i < dataone.length - 1; i++) {

const arc = d3.arc()
.innerRadius(2 * (100 - dataone[i]))
.outerRadius(2 * (100 - dataone[i + 1]))
.startAngle(0)
.endAngle(2 * Math.PI);

svg.select("#spot_" + (10 * i + 2))
.append("path")
.attr("d", arc)
.style("opacity", 1)
.style("stroke", "none")
.style("fill", d3.rgb(0,225,255-i*10))
}

for (let lev = 0; lev < position; lev++) {

svg.select("#spot_"+ lev)
.transition()
.duration(10000)
.attr("transform", function () {
const reverse = lev * 1.5
return "translate(" + (100 + reverse * 8) + "," + (130 + reverse * 2) +
")rotate(315)skewX(-45)skewY(10)translate(" + -reverse * 5 + "," +
-reverse * 2 + ")scale(.5)";
})
}
return svg.node();
}
Insert cell
d3 = require("d3@6")
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more