Experimenting with ways to visualise ratios
forked from tlfrd's block: Visualising Ratios
xxxxxxxxxx
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<style>
text {
font-family: monospace;
}
</style>
</head>
<body>
<script>
var margin = {top: 70, right: 20, bottom: 20, left: 20};
var width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var ratios = [
{min: 34, median: 8},
{min: 14.1, median: 7.6},
{min: 15, median: 9},
{min: 12.9, median: 5.8},
{min: 10.6, median: 4.2},
{min: 40, median: 5.9},
{min: 14.3, median: 5.58}
];
// might use this at some point
// ratios.sort(function(a, b) {
// return b.min - a.min;
// })
var xSpacing = 15,
ySpacing = 30;
var ratioGroups = svg.selectAll("g")
.data(ratios)
.enter().append("g")
.attr("class", "ratio");
var counter = 0;
ratioGroups.selectAll("circles")
.data(function(d, i) {
var range = d3.range(0, Math.round(d.min), 1);
return range.map(function(x) {
return {x: x, i: i};
})
})
.enter().append("circle")
.attr("cx", function(d) { return margin.left + d.x * xSpacing })
.attr("cy", function(d) { return margin.top + d.i * ySpacing })
.attr("r", function(d) {
if (d.x == 0) {
return 5;
} else {
return 0.001;
}
})
.attr("fill", function(d) {
if (d.x == 0) {
d3.select(this).raise();
return "red";
} else {
return "black";
}
})
.transition()
.delay(function(d) {
return (d.x * 25) + (d.i * 100);
})
.attr("r", 5)
// delay by the amount of time each ratio takes to animate
ratioGroups
.append("text")
.attr("x", function(d) { return margin.left + Math.round(d.min) * xSpacing })
.attr("y", function(d, i) { return margin.top + i * ySpacing })
.attr("dy", "0.35em")
.text(function(d) { return d.min + ":1"; })
.attr("opacity", 0)
.transition()
.delay(function(d, i) { return (Math.round(d.min) * 25) + (i * 100) })
.attr("opacity", 1);
</script>
</body>
https://d3js.org/d3.v4.min.js