D3
OG
Old school D3 from simpler times
All examples
By author
By category
About
stevenwmarks
Full window
Github gist
boating accidents
Built with
blockbuilder.org
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Boating Accidents and Fatalities</title> <script type="text/javascript" src="https://d3js.org/d3.v4.min.js"></script> <style> body { font-family: Verdana, Tahoma, sans-serif; } #container svg { border: 1px solid gray;} .line { fill: none; stroke: orange; stroke-width: 4px; opacity: 0; } #hede0 {font-weight: bold; font-size: 16pt; } #band { width: 565px; height: 70px; fill: red; opacity: 0.33; } #blank0 {opacity: 0; position: fixed; left: 9px; top: 9px; width: 615px; height: 550px; z-index: 1; background-color: white; } #text2 {opacity: 0; font-weight: bold; } #hede1 {opacity: 0; font-weight: bold; font-size: 14pt; } .numBar { fill: #ff8c00; } </style> </head> <body> <div id="container"> <script type="text/javascript"> var margin = {top: 100, right: 20, bottom: 20, left: 50}, width = 615 - margin.left - margin.right, height = 550 - margin.top - margin.bottom; var parseTime = d3.timeParse("%Y"); //set scales (range) var x = d3.scaleTime() .range([0, width]); var y = d3.scaleLinear() .range([height, 0]); //define line var totalLine = d3.line() .x(function(d) { return x(d.year); }) .y(function(d) { return y(d.totalAcc); }); //append svg for chart var svg = d3.select("#container").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 + ")"); //get data d3.csv("accData.csv", function(error, data) { if (error) throw error; // format data data.forEach(function(d) { d.year = parseTime(d.year); d.totalAcc = +d.totalAcc; }); //set domains x.domain(d3.extent(data, function(d) { return d.year; })); y.domain([0, d3.max(data, function(d) { return Math.max(d.totalAcc); })]); // add X axis svg.append("g") .attr("transform", "translate(0, " + height + ")") .call(d3.axisBottom(x) .ticks(5)); // add Y axis svg.append("g") .call(d3.axisLeft(y)); //append hede0 svg.append("text") .attr("x", 2000) .attr("y", 0 - (height/10)) .attr("id", "hede0") .text("Recreational Boating Accidents 2012-2016") .transition() //fly in .duration(2000) .attr("x", 0); //append dots for totalAcc svg.selectAll("circle") .data(data) .enter().append("circle") .transition() .delay(2000) .duration(2000) .attr("r", 6) .attr("cx", function(d) { return x(d.year); }) .attr("cy", function(d) { return y(d.totalAcc); }) .style("fill", "orange"); //append line for totalAcc svg.append("path") .data([data]) .attr("class", "line") .attr("d", totalLine) .transition() .delay(4000) .duration(1000) .style("opacity", 1); //fly in rectangle for band svg.append("rect") .attr("x", 2000) .attr("y",0 - 10) .attr("id", "band") .transition() .delay(6000) .duration(2000) .attr("x", -5); //append text1 svg.append("text") .attr("x", 2000) .attr("y", -2000) .text("The total number of accidents each year stays within") .transition() .delay(4000) .duration(2000) .attr("x", 75) .attr("y", 100); //append text1a svg.append("text") .attr("x", 2000) .attr("y", -2000) .text("a fairly narrow range, roughly 4,000 to 4,500 accidents.") .transition() .delay(4500) .duration(2000) .attr("x", 75) .attr("y", 120); //append text2 svg.append("text") .attr("x", 85) .attr("y", 7) .attr("id", "text2") .text("Next: Types of Accidents 2012-2016") .transition() .delay(9000) .style("opacity", 1); //disappear everything with a fixed position div in white faded in d3.select("body") .append("div") .attr("id", "blank0") .transition() .duration(1500) .delay(11000) .style("opacity", 1); //This is "slide 2" //append svg1 to slide 2 var margin1 = {top: 100, right: 20, bottom: 20, left: 160}, width1 = 615 - margin1.left - margin1.right, height1 = 550 - margin1.top - margin1.bottom; var svg1 = d3.select("#blank0").append("svg") .attr("width", width1 + margin1.left + margin1.right) .attr("height", height1 + margin1.top + margin1.bottom) .append("g") .attr("transform", "translate(" + margin1.left + "," + margin1.top + ")"); // set ranges var y1 = d3.scaleBand() .range([height1, 0]) .padding(0.2) var x1 = d3.scaleLinear() .range([0, width1]); //append hede1 svg1.append("text") .attr("x", 0 - 100) .attr("y", 0 - (height1/10)) .attr("id", "hede1") .text("Recreational Boating Accidents by Type 2012-2016") .transition() .delay(11500) .style("opacity", 1); // get data d3.csv("accType5yr.csv", function(error, data) { if (error) throw error; // format data data.forEach(function(d) { d.accNum = +d.accNum; }); //set domains y1.domain(data.map(function(d) { return d.accType; })); x1.domain([0, d3.max(data, function(d) { return d.accNum; })]); // append saved rectangles to bar chart svg1.selectAll(".numBar") .data(data) .enter().append("rect") .attr("class", "numBar") .attr("y", function(d) { return y1(d.accType); }) .attr("height", y1.bandwidth()) .attr("x", 0) .attr("width", function(d) { return x1(d.accNum); }); // add X axis svg1.append("g") .attr("transform", "translate(0, " + height1 + ")") .call(d3.axisBottom(x1)); // add Y axis svg1.append("g") .call(d3.axisLeft(y1)); }); //end of slide2 }); //end of slide1 </script> </div> </body> </html>
https://d3js.org/d3.v4.min.js