Burgernomics and an excuse to play with d3 images?...
Real talk though, Whataburger > everything else.
🍔 🍔 🍔
Data:
Burgernomics and an excuse to play with d3 images?...
Real talk though, Whataburger > everything else.
🍔 🍔 🍔
Data:
cost | country | |
---|---|---|
6.59 | Switzerland | |
5.51 | Norway | |
5.23 | Sweden | |
5.06 | Finland | |
5.04 | United States | |
4.78 | Brazil | |
4.62 | Italy | |
4.60 | Canada | |
4.51 | France | |
4.44 | Denmark | |
4.40 | Ireland | |
4.38 | Israel | |
4.35 | Belgium | |
4.30 | Australia | |
4.22 | New Zealand | |
4.21 | Euro area | |
4.17 | Germany | |
4.12 | Costa Rica | |
4.08 | Uruguay | |
4.01 | Singapore | |
3.96 | Austria | |
3.94 | Britain | |
3.86 | South Korea | |
3.85 | Spain | |
3.80 | Netherlands | |
3.69 | Greece | |
3.63 | Sri Lanka | |
3.58 | Pakistan | |
3.54 | UAE | |
3.53 | Turkey | |
3.53 | Chile | |
3.47 | Japan | |
3.41 | Estonia | |
3.40 | Thailand | |
3.38 | Venezuela | |
3.36 | Portugal | |
3.35 | Argentina | |
3.20 | Saudi Arabia | |
3.15 | Hungary | |
3.06 | Czech Republic | |
3.04 | Colombia | |
3.02 | Peru | |
2.82 | Philippines | |
2.79 | China | |
2.69 | Vietnam | |
2.59 | Egypt | |
2.48 | Hong Kong | |
2.42 | Poland | |
2.41 | India | |
2.37 | Mexico | |
2.36 | Indonesia | |
2.15 | Taiwan | |
2.10 | South Africa | |
2.05 | Russia | |
1.99 | Malaysia | |
1.57 | Ukraine |
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
.tooltip { | |
position: absolute; | |
padding: 10px; | |
font: 12px sans-serif; | |
background: #222; | |
color: #fff; | |
border: 0px; | |
border-radius: 8px; | |
pointer-events: none; | |
opacity: 0.9; | |
visibility: hidden; | |
} | |
</style> | |
<script src="//d3js.org/d3.v3.min.js"></script> | |
<script> | |
/////////////////////// | |
// Parse the Data | |
d3.csv("bigmac.csv", function(data) { | |
/////////////////////// | |
// Chart Size Setup | |
var margin = { top: 35, right: 0, bottom: 30, left: 40 }; | |
var width = 960 - margin.left - margin.right; | |
var height = 500 - margin.top - margin.bottom; | |
var chart = d3.select(".chart") | |
.attr("width", 960) | |
.attr("height", 500) | |
.append("g") | |
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
/////////////////////// | |
// Title | |
chart.append("text") | |
.text('Burgernomics (2016, US $)') | |
.attr("text-anchor", "middle") | |
.attr("class", "graph-title") | |
.attr("y", -10) | |
.attr("x", width / 2.0); | |
var yPos = function(i) { | |
var row = Math.ceil((i + 1) / 10); | |
return 100 * row - (5 * row * row); | |
}; | |
// I'm sure there's a better way to do this... | |
// probably involves tweaking the math in yPos | |
var labelOffset = function(i) { | |
var row = Math.ceil((i + 1) / 10); | |
return 2 * row; | |
}; | |
var xPos = function(i) { | |
var col = i % 10; | |
return 96 * col; | |
}; | |
var bSize = function(d) { | |
return 14 * d['cost']; | |
}; | |
/////////////////////// | |
// Burgers | |
var burger = chart.selectAll(".burger") | |
.data(data) | |
.enter().append("image") | |
.attr("xlink:href", "http://www.mcdonalds.co.uk/content/dam/mcdonaldsuk/item/live/mcdonalds-Big-Mac.png") | |
.attr("width", "5px") | |
.attr("height", "5px") | |
.attr("y", function(d, i) { return yPos(i) - bSize(d); }) | |
.attr("x", function(d, i) { return xPos(i) - bSize(d) / 2.0; }); | |
burger.transition() | |
.duration(4000) | |
.ease("elastic") | |
.attr("width", bSize) | |
.attr("height", bSize); | |
var label = chart.selectAll(".label") | |
.data(data) | |
.enter().append("text") | |
.text(function(d) { return d['country']; }) | |
.attr("class", "label") | |
.attr("text-anchor", "middle") | |
.attr("alignment-baseline", "baseline") | |
.attr("y", function(d, i) { return yPos(i) + labelOffset(i); }) | |
.attr("x", function(d, i) { return xPos(i); }); | |
/////////////////////// | |
// Tooltips | |
var tooltip = d3.select("body").append("div") | |
.attr("class", "tooltip"); | |
burger.on("mouseover", function(d) { | |
tooltip.html("$"+d['cost']) | |
.style("visibility", "visible"); | |
}) | |
.on("mousemove", function(d) { | |
tooltip.style("top", event.pageY - (tooltip[0][0].clientHeight + 5) + "px") | |
.style("left", event.pageX - (tooltip[0][0].clientWidth / 2.0) + "px"); | |
}) | |
.on("mouseout", function(d) { | |
tooltip.style("visibility", "hidden"); | |
}); | |
}); | |
</script> | |
<body> | |
<svg class="chart"></svg> | |
</body> |