index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sparklines</title>
<script type="text/javascript" src="//d3js.org/d3.v3.js"></script>
<style type="text/css">
body {
background-color: white;
font-family: sans-serif;
}
h1 {
font-size: 30px;
margin: 0 0 10px 0;
}
p1 {
font-size: 16px;
margin: 0 0 20px 0;
color: #000000;
}
p2 {
font-size: 12px;
margin: 0 4px 5px 4px;
color: #000000;
}
svg {
background-color: whitesmoke;
display: block;
margin-bottom: 5px;
}
path.line:hover {
stroke-width: 4;
}
circle:hover{
r: 5;
}
.pointHR {
fill: #339933;
}
.pointWAR {
fill: #000000;
}
.pointBA {
fill: #0066CC;
}
</style>
</head>
<body>
<h1>Top Career Hitters</h1>
<p1>Yearly <strong style= "color: #000000">Offensive Wins Above Replacement (WAR)</strong>, <strong style= "color: #0066CC">Batting Average</strong>, and <strong style= "color: #339933">Home Runs</strong> (ranked by lifetime Offensive WAR)</p1>
<br>
<br>
<p2><img src="https://upload.wikimedia.org/wikipedia/commons/0/0f/Black_dot.png" style="width:8px;height:8px;"> = Led League</p2>
<p2><img src="//www.clipartbest.com/cliparts/dc6/Mzr/dc6Mzr5Mi.png" style="width:12px;height:12px;"> = Won World Series</p2>
<p2><img src="//cdn.flaticon.com/png/256/54688.png" style="width:10px;height:10px;"> = All Star</p2>
<br>
<br>
<script type="text/javascript">
var w = 420;
var h = 95;
var padding = [ 24, 10, 25, 10 ];
var xScale = d3.scale.linear()
.range([ padding[3], w - padding[1] ]);
var xScaleYear = d3.scale.linear()
.range([ padding[3], w - padding[1] ]);
var yScaleWAR = d3.scale.linear()
.range([ padding[0], h - padding[2] ]);
var yScaleBA = d3.scale.linear()
.range([ padding[0], h - padding[2] ]);
var yScaleHR = d3.scale.linear()
.range([ padding[0], h - padding[2] ]);
var lineWAR = d3.svg.line()
.x(function(d) {return xScale(d.Age);})
.y(function(d) {return yScaleWAR(d.WAR);});
var lineBA = d3.svg.line()
.x(function(d) {return xScale(d.Age);})
.y(function(d) {return yScaleBA(d.BA);});
var lineHR = d3.svg.line()
.x(function(d) {return xScale(d.Age);})
.y(function(d) {return yScaleHR(d.HR);});
var areaWAR = d3.svg.area()
.x(function(d) {return xScale(d.Age);})
.y0(h-padding[2])
.y1(function(d) {return yScaleWAR(d.WAR);});
var r = 3
var imagew = 13
d3.csv("TopTenHittersSmall.csv", function(HitterData) {
var players = d3.nest()
.key(function(d){return d.Player;}).entries(HitterData);
players.forEach(function(s){s.minAge = d3.min(s.values, function(d){ return d.Age;}); });
players.forEach(function(s){s.maxAge = d3.max(s.values, function(d){ return d.Age;}); });
players.forEach(function(s){s.minYear = d3.min(s.values, function(d){ return d.Year;}); });
players.forEach(function(s){s.maxYear = d3.max(s.values, function(d){ return d.Year;}); });
xScale.domain([
d3.min(HitterData, function(d) {
return d.Age;}),
d3.max(HitterData, function(d) {
return d.Age;})
]);
yScaleWAR.domain([
d3.max(HitterData, function(d) {
return +d.WAR;}),
0
]);
yScaleBA.domain([
d3.max(HitterData, function(d) {
return +d.BA;}),
0
]);
yScaleHR.domain([
d3.max(HitterData, function(d) {
return +d.HR;}),
0
]);
var svg = d3.select("body")
.selectAll("svg")
.data(players)
.enter()
.append("svg")
.attr("width", w)
.attr("height", h);
svg.append("path")
.attr("class","area")
.attr("d",function(d){return areaWAR(d.values); })
.attr("fill", "#CFCFCF");
svg.append("path")
.attr("class","line")
.attr("d",function(d){return lineWAR(d.values); })
.attr("fill", "none")
.attr("stroke", "#000000")
.attr("stroke-width", 2);
svg.append("path")
.attr("class","line")
.attr("d",function(d){return lineHR(d.values); })
.attr("fill", "none")
.attr("stroke", "#339933")
.attr("stroke-width", 2);
svg.append("path")
.attr("class","line")
.attr("d",function(d){return lineBA(d.values); })
.attr("fill", "none")
.attr("stroke", "#0066CC")
.attr("stroke-width", 2);
var svg1 = d3.select("body").select("svg")
.append("svg")
.attr("width", w)
.attr("height", h);
svg1.selectAll("pointWAR")
.data(HitterData)
.enter()
.append("circle")
.attr("class", "pointWAR")
.attr("cx", function(d) {
return xScale(d.Age);
})
.attr("cy", function(d) {
return yScaleWAR(d.WARlead);
})
.attr("r", function(d) { return Math.ceil((d.WARlead)/10000)*r;});
svg1.selectAll("pointHR")
.data(HitterData)
.enter()
.append("circle")
.attr("class", "pointHR")
.attr("cx", function(d) {
return xScale(d.Age);
})
.attr("cy", function(d) {
return yScaleHR(d.HRlead);
})
.attr("r", function(d) { return Math.ceil((d.HRlead)/10000)*r;});
svg1.selectAll("pointBA")
.data(HitterData)
.enter()
.append("circle")
.attr("class", "pointBA")
.attr("cx", function(d) {
return xScale(d.Age);
})
.attr("cy", function(d) {
return yScaleBA(d.BAlead);
})
.attr("r", function(d) { return Math.ceil((d.BAlead)/10000)*r;});
svg1.selectAll("pointAS")
.data(HitterData)
.enter()
.append("image")
.attr("xlink:href", "//cdn.flaticon.com/png/256/54688.png")
.attr("x", function(d) {
return xScale(d.Age)-(imagew/2);
})
.attr("y", function(d) {
return yScaleWAR(d.AllStar)+2;
})
.attr("width", function(d) { return Math.ceil((d.AllStar)/10000)*(imagew*.8);})
.attr("height", function(d) { return Math.ceil((d.AllStar)/10000)*(imagew*.8);});
svg1.selectAll("pointWS")
.data(HitterData)
.enter()
.append("image")
.attr("xlink:href", "//www.clipartbest.com/cliparts/dc6/Mzr/dc6Mzr5Mi.png")
.attr("x", function(d) {
return xScale(d.Age)-(imagew/2);
})
.attr("y", function(d) {
return yScaleWAR(d.WorldSeries)-imagew+2;
})
.attr("width", function(d) { return Math.ceil((d.WorldSeries)/10000)*imagew;})
.attr("height", function(d) { return Math.ceil((d.WorldSeries)/10000)*imagew;});
svg1.selectAll("pointMVP")
.data(HitterData)
.enter()
.append("text")
.attr("x", function(d) {
return xScale(d.Age)-(10);
})
.attr("y", function(d) {
return yScaleWAR(d.MVP)+12;
})
.attr("font-size", function(d) { return Math.ceil((d.MVP)/10000)*10;})
.text("MVP")
;
svg.append("text")
.attr("x", 5)
.attr("y",15)
.attr("font-size",14)
.attr("font-weight","bold")
.text(function(d){return d.key ;});
svg.append("text")
.attr("x", 5)
.attr("y",27)
.attr("font-size",10)
.text(function(d){return d.minYear+"-"+d.maxYear;});
svg.append("text")
.attr("x", function(d){return xScale(d.minAge)-5;})
.attr("y",h-padding[2]+10)
.attr("font-size",10)
.text(function(d){return d.minAge;}); svg.append("text")
.attr("x", function(d){return xScale(d.maxAge)-5;})
.attr("y",h-padding[2]+10)
.attr("font-size",10)
.text(function(d){return d.maxAge;});
svg1.append("text")
.attr("x", function(d){return xScale(d.minAge)+9;})
.attr("y",h-padding[2]+10)
.attr("font-size",10)
.text(" years old");
svg1.append("text")
.attr("x", function(d){return xScale(d.maxAge)+9;})
.attr("y",h-padding[2]+10)
.attr("font-size",10)
.text(" years old");
});
</script>
</body>
</html>