Built with blockbuilder.org
xxxxxxxxxx
<meta charset="utf-8">
<head>
<title>GII Ranks</title>
<link href='https://fonts.googleapis.com/css?family=Abel' rel='stylesheet' type='text/css'>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<!-- load the d3.js library -->
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
// Set the dimensions of the canvas / graph
var margin = {top: 40, right: 20, bottom: 70, left: 50},
width = 1000 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var div = d3.select("body").append("div")
.attr("class", "tooltip")
.style("opacity", 0);
// Parse the date / time
var parseDate = d3.timeParse("%Y");
// Set the ranges
var x = d3.scaleTime().range([0, width]);
var y = d3.scaleLinear().range([0, height]);
// Define the line
var ranks = d3.line()
.x(function(d) { return x(d.year); })
.y(function(d) { return y(d.ranks); });
// Adds the svg canvas
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 + ")");
// Get the data
d3.csv("ts_long.csv", function(error, data) {
data.forEach(function(d) {
d.year = parseDate(d.year);
d.ranks = +d.ranks;
});
// Scale the range of the data
x.domain(d3.extent(data, function(d) { return d.year; }));
y.domain([0, d3.max(data, function(d) { return d.ranks; })]);
// Nest the entries by symbol
var dataNest = d3.nest()
.key(function(d) {return d.country;})
.entries(data);
// set the colour scale
var color = d3.scaleOrdinal(d3.schemeCategory10);
legendSpace = width/dataNest.length; // spacing for the legend
// Loop through each symbol / key
dataNest.forEach(function(d,i) {
svg.append("path")
.attr("class", "line")
.style("stroke", function() { // Add the colours dynamically
return d.color = color(d.key); })
.attr("d", ranks(d.values))
.on("mouseover", function (d) {
div.transition()
.duration(200)
.style("opacity", .7);
div.html( "Country: " + d.country + "</br>" + "Rank: " + d.ranks)
.style("left", (d3.event.pageX) + "px")
.style("top", (d3.event.pageY - 28) + "px");
});
// Add the Legend
svg.append("text")
.attr("x", (legendSpace/2)+i*legendSpace) // space legend
.attr("y", height + (margin.bottom/2)+ 5)
.attr("class", "legend") // style the legend
.style("fill", function() { // Add the colours dynamically
return d.color = color(d.key); })
.text(d.key);
});
// Add the X Axis
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
// Add the Y Axis
svg.append("g")
.attr("class", "axis")
.call(d3.axisLeft(y));
// titling
svg.append("text")
.attr("class", "title")
.attr("x", 0)
.attr("y", -10)
.style("fill","#333")
.text("Global Innovation Index");
svg.append("text")
.attr("class", "text")
.attr("x",500)
.attr("y",-10)
.style("fill","#444")
.attr("text-anchor","start")
.text("by Zoe Meers.");
svg.append("text")
.attr("class", "text")
.attr("x",-50)
.attr("y",50)
.text("Rank");
});
</script>
</body>
https://d3js.org/d3.v4.min.js