Skip to content

Instantly share code, notes, and snippets.

@emilyw15
Last active October 25, 2017 21:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save emilyw15/dc32792df374eace54253065bad60567 to your computer and use it in GitHub Desktop.
Save emilyw15/dc32792df374eace54253065bad60567 to your computer and use it in GitHub Desktop.
MTA Avg. Ridership
license: mit
Month Avg_Riders Type
Jan 37667 Metro
Feb 37428 Metro
Mar 34319 Metro
Apr 36558 Metro
May 36684 Metro
Jun 39484 Metro
Jan 18225 Light Rail
Feb 20202 Light Rail
Mar 22669 Light Rail
Apr 23613 Light Rail
May 20547 Light Rail
Jun 23981 Light Rail
Jan 6539 MARC Brunswick
Feb 7084 MARC Brunswick
Mar 6824 MARC Brunswick
Apr 7114 MARC Brunswick
May 7333 MARC Brunswick
Jun 7497 MARC Brunswick
Jan 3669 MARC Camden
Feb 4110 MARC Camden
Mar 4186 MARC Camden
Apr 4575 MARC Camden
May 4896 MARC Camden
Jun 4684 MARC Camden
Jan 20978 MARC Penn
Feb 21515 MARC Penn
Mar 21659 MARC Penn
Apr 23475 MARC Penn
May 23508 MARC Penn
Jun 24267 MARC Penn
Jan 994 CB Baltimore
Feb 1181 CB Baltimore
Mar 1174 CB Baltimore
Apr 1114 CB Baltimore
May 1139 CB Baltimore
Jun 1110 CB Baltimore
Jan 10353 CB Washington
Feb 14049 CB Washington
Mar 13725 CB Washington
Apr 13422 CB Washington
May 13567 CB Washington
Jun 13450 CB Washington
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>D3 Example</title>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3-legend/1.1.0/d3-legend.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3-tip/0.6.3/d3-tip.min.js"></script>
<link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
<style>
.axis text {
font-family: 'Open Sans', sans-serif;
font-size: 13pt;
}
.axis .label {
font-size: 20pt;
}
.axis path, .axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.color-legend text {
font-family: 'Open Sans', sans-serif;
font-size: 10pt;
}
.d3-tip {
font-family: 'Open Sans', sans-serif;
font-size: 15pt;
line-height: 1;
padding: 7px;
background: black;
color: lightgray;
border-radius: 20px;
}
</style>
</head>
<body>
<script>
var outerWidth = 960;
var outerHeight = 500;
var margin = { left:50, top: 40, right: 30, bottom: 47 };
var barPadding = 0.2;
var xColumn = "Avg_Riders";
var yColumn = "Month";
var colorColumn = "Type";
var layerColumn = colorColumn;
var hoveredColorValue;
var hoveredStrokeColor = "black";
var innerWidth = outerWidth - margin.left - margin.right;
var innerHeight = outerHeight - margin.top - margin.bottom;
var svg = d3.select("body").append("svg")
.attr("width", outerWidth)
.attr("height", outerHeight);
var g = svg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// This is the layer where the bars are drawn.
var baseBarLayer = g.append("g");
// This layer contains a semi-transparent overlay
// that fades out the base bars.
var overlayRect = g.append("g")
.append("rect")
.attr("width", innerWidth)
.attr("height", innerHeight)
.attr("fill", "none")
.style("pointer-events", "none");
// This contains the subset of bars rendered on top
// when you hover over the entries in the color legend.
var foregroundBarLayer = g.append("g");
var xAxisG = g.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + innerHeight + ")");
var yAxisG = g.append("g")
.attr("class", "y axis");
var colorLegendG = g.append("g")
.attr("class", "color-legend")
.attr("transform", "translate(596, 0)");
var xScale = d3.scale.linear().range([0, innerWidth]);
var yScale = d3.scale.ordinal().rangeBands([innerHeight, 0], barPadding);
var colorScale = d3.scale.category10();
var tipNumberFormat = d3.format(",");
var tip = d3.tip()
.attr("class", "d3-tip")
.offset([-10, 0])
.html(function(d) {
return [
d[colorColumn],
" in ",
d[yColumn],
": ",
tipNumberFormat(d[xColumn])
].join("");
});
g.call(tip);
var xAxis = d3.svg.axis().scale(xScale).orient("bottom")
.ticks(5)
.outerTickSize(0);
var yAxis = d3.svg.axis().scale(yScale).orient("left")
.outerTickSize(0);
var colorLegend = d3.legend.color()
.scale(colorScale)
.shapePadding(6.24)
.shapeWidth(25)
.shapeHeight(25)
.labelOffset(5);
function render(data){
var nested = d3.nest()
.key(function (d){ return d[layerColumn]; })
.entries(data);
var stack = d3.layout.stack()
.y(function (d){ return d[xColumn]; })
.values(function (d){ return d.values; });
var layers = stack(nested.reverse()).reverse();
xScale.domain([
0,
d3.max(layers, function (layer){
return d3.max(layer.values, function (d){
return d.y0 + d.y;
});
})
]);
yScale.domain(layers[0].values.map(function (d){
return d[yColumn];
}));
colorScale.domain(layers.map(function (layer){
return layer.key;
}));
xAxisG.call(xAxis);
yAxisG.call(yAxis);
renderBars(baseBarLayer, layers);
if(hoveredColorValue){
setOverlayTransparency(0.7);
renderBars(foregroundBarLayer, layers.filter(function (layer){
return layer.key === hoveredColorValue;
}));
} else {
setOverlayTransparency(0.0);
renderBars(foregroundBarLayer, []);
}
colorLegendG.call(colorLegend);
// Move the text down a bit.
colorLegendG.selectAll("text").attr("y", 4);
listenForHover(colorLegendG.selectAll("rect"), data);
listenForHover(colorLegendG.selectAll("text"), data);
}
function renderBars(g, layers){
var layerGs = g.selectAll(".layer").data(layers);
layerGs.enter().append("g").attr("class", "layer");
layerGs.exit().remove();
layerGs.style("fill", function (d){
return colorScale(d.key);
});
var bars = layerGs.selectAll("rect").data(function (d){
return d.values;
});
bars.enter().append("rect")
.on("mouseover", function(d){
tip.show(d);
// Fix the issue where the tip goes off the screen.
d3.select(".d3-tip").style("left", "100px");
})
.on("mouseout", tip.hide);
bars.exit().remove();
bars
.attr("x", function (d){ return xScale(d.y0); })
.attr("y", function (d){ return yScale(d[yColumn]); })
.attr("width", function (d){ return xScale(d.y); })
.attr("height", yScale.rangeBand());
}
function listenForHover(selection, data){
selection
.on("mouseover", function (d){
hoveredColorValue = d;
render(data);
})
.on("mouseout", function (d){
hoveredColorValue = null;
render(data);
})
.style("cursor", "pointer");
}
function setOverlayTransparency(alpha){
overlayRect
.transition().duration(400)
.attr("fill", "rgba(255, 255, 255, " + alpha + ")");
}
function type(d){
d.Avg_Riders = +d.Avg_Riders;
return d;
}
d3.csv("commuter_data.csv", type, render);
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment