<!doctype html>
<html>
<head>
<link rel="stylesheet" href="lib/style.css">
</head>
<body>
<div id="myLineChart"></div>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="lib/script.js"></script>
</body>
</html>
/* Add your styles here */
// Dimensions and margins
var margin = {top: 10, right: 100, bottom: 100, left: 30},
width = 450 - margin.left - margin.right,
height = 350 - margin.top - margin.bottom;
// Append to body
var svg = d3.select("#myLineChart")
.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 + ")");
//R Read the data
d3.json("data.json", function(data) {
// A color scale: one color for each group
var myColor = d3.scaleOrdinal()
.domain(["Akeela", "Jamal"])
.range(d3.schemeCategory10);
// parse the date / time
var parseTime = d3.timeParse("%Y-%m-%d");
// set the ranges
var x = d3.scaleTime().range([0, width]);
var y = d3.scaleLinear().range([height, 0]);
// define the first line
var line1 = d3.line()
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.Akeela); })
.curve(d3.curveMonotoneX) ;
// define the second line
var line2 = d3.line()
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.Jamal); })
.curve(d3.curveMonotoneX) ;
// format the data
data.forEach(function(d) {
d.date = parseTime(d.date);
d.Akeela = +d.Akeela;
d.Jamal = +d.Jamal;
});
// sort years ascending
data.sort(function(a, b){
return a["date"]-b["date"];
})
// Scale the range of the data
x.domain(d3.extent(data, function(d) { return d.date; })); //list of all dates
y.domain([0, d3.max(data, function(d) {
return Math.max(d.Akeela, d.Jamal); })]);
// Add first line
svg.append("path")
.data([data])
.attr("class", "line")
.attr("d", line1)
.attr("fill", "none")
.attr("stroke", "#8CD3DD");
// Add second line
svg.append("path")
.data([data])
.attr("class", "line")
.attr("d", line2)
.attr("fill", "none")
.attr("stroke", "#69b3a2");
// Add Y Axis
svg.append("g")
.attr("class", "axis")
.call(d3.axisLeft(y));
// Add X Axis
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x)
.tickFormat(d3.timeFormat("%a %b %d"))
.tickValues(data.map(function(d){return d.date})))
.selectAll("text")
.style("text-anchor", "end")
.attr("dx", "-.8em")
.attr("dy", ".15em")
.attr("transform", "rotate(-65)");
// Add line labels
svg.append("text")
.data([data])
.text("Akeela")
.attr("transform", "translate(" + width + "," + y(data[data.length-1].Akeela) + ")")
.style("fill","#8CD3DD")
.attr("x", 12)
.attr("y", -8)//move up a bit;
svg.append("text")
.data([data])
.text("Jamal")
.attr("transform", "translate(" + width + "," + y(data[data.length-1].Jamal) + ")")
.style("fill","#69b3a2")
.attr("x", 12)
.attr("y", 8);
}
)
[
{
"date": "2020-09-05",
"Akeela": 3,
"Jamal": 5
},{
"date": "2020-09-06",
"Akeela": 2,
"Jamal": 3
},{
"date": "2020-09-02",
"Akeela": 3,
"Jamal": 4
},{
"date": "2020-09-04",
"Akeela": 6,
"Jamal": 4
},{
"date": "2020-09-03",
"Akeela": 6,
"Jamal": 3
},{
"date": "2020-09-07",
"Akeela": 5,
"Jamal": 2
},{
"date": "2020-09-01",
"Akeela": 2,
"Jamal": 3
}
]