New Year's Resolution for 2017: Make a D3 Block a day to teach myself D3. This is Number 3. This example modifies the line chart from January 2nd and attempts to create a scatter plot using some longitudinal education data. Props to Malcolm Maclean's D3.js Tips and Tricks V4 for detailed coding examples.
xxxxxxxxxx
<meta charset="utf-8">
<head>
<title>D3 Block-a-Day: Day 3, January 3, 2017</title>
<link rel="stylesheet" type="text/css" href="styles.css"/>
<script src="https://d3js.org/d3.v4.min.js"></script> <!-- Load the d3.js library -->
<style> /* set the CSS */
body {
font: 20px Helvetica Neue;
}
.dot {
stroke: #000;
fill: #ffe0e0;
}
.axis {
font: 14px Helvetica Neue;
}
.grid line {
stroke: lightgrey;
stroke-opacity: 0.7;
shape-rendering: crispEdges;
}
.grid path {
stroke-width: 0;
}
</style>
</head>
<body>
<script>
// set the dimensions and margins of the graph
var margin = {top: 20, right: 20, bottom: 50, left: 70},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// set the ranges
var x = d3.scaleLinear().range([0, width]);
var y = d3.scaleLinear().range([height, 0]);
// define the line
var valueline = d3.line()
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.close); });
// append the svg obgect to the body of the page
// appends a 'group' element to 'svg'
// moves the 'group' element to the top left margin
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 + ")");
// gridlines in x axis function
function make_x_gridlines() {
return d3.axisBottom(x)
.ticks(5)
}
// gridlines in y axis function
function make_y_gridlines() {
return d3.axisLeft(y)
.ticks(5)
}
// Get the data
d3.csv("scale_scores.csv", function(error, data) {
if (error) throw error;
// format the data
data.forEach(function(d) {
d.scale_score_2015 = +d.SCALE_SCORE_2015;
d.scale_score_2016 = +d.SCALE_SCORE_2016;
});
// Scale the range of the data
x.domain([200,800]);
y.domain([200,800]);
svg.selectAll("dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 6)
.attr("cx", function(d) { return x(d.scale_score_2015); })
.attr("cy", function(d) { return y(d.scale_score_2016); });
// Add the x Axis
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x).ticks(5))
.attr("class", "axis");
// text label for the x axis
svg.append("text")
.attr("transform",
"translate(" + (width*0.1) + " ," +
(height + margin.top + 30) + ")")
.style("text-anchor", "middle")
.style("font-family", "Helvetica Neue")
.text("Scale Score 2015");
// Add the y Axis
svg.append("g")
.call(d3.axisLeft(y))
.style("font-family", "Helvetica Neue")
.attr("class", "axis");
// text label for the y axis
svg.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 0 - margin.left)
.attr("x", - 0.75*height)
.attr("dy", "1em")
.style("text-anchor", "middle")
.style("font-family", "Helvetica Neue")
.text("Scale Score 2016");
// add the X gridlines
svg.append("g")
.attr("class", "grid")
.attr("transform", "translate(0," + height + ")")
.call(make_x_gridlines()
.tickSize(-height)
.tickFormat("")
)
// add the Y gridlines
svg.append("g")
.attr("class", "grid")
.call(make_y_gridlines()
.tickSize(-width)
.tickFormat("")
)
});
</script>
</body>
https://d3js.org/d3.v4.min.js