Skip to content

Instantly share code, notes, and snippets.

@tylermachado
Last active August 29, 2015 14:16
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 tylermachado/d9431ea6c3f74a88e3cb to your computer and use it in GitHub Desktop.
Save tylermachado/d9431ea6c3f74a88e3cb to your computer and use it in GitHub Desktop.
MLS Goals 2014
{
"name": "MLS",
"children": [
{
"name": "NY",
"children": [
{
"name": "Bradley Wright-Phillips",
"goals": 27
},
{
"name": "Thierry Henry",
"goals": 10
},
{
"name": "Peguy Luyindula",
"goals": 5
},
{
"name": "Lloyd Sam",
"goals": 4
},
{
"name": "Dax McCarty",
"goals": 3
},
{
"name": "Tim Cahill",
"goals": 2
},
{
"name": "Eric Alexander",
"goals": 2
},
{
"name": "Saer Sene",
"goals": 1
},
{
"name": "Ruben Bover",
"goals": 1
},
{
"name": "Jonny Steele",
"goals": 1
}
]
},
{
"name": "KC",
"children": [
{
"name": "Dom Dwyer",
"goals": 22
},
{
"name": "Graham Zusi",
"goals": 5
},
{
"name": "Benny Feilhaber",
"goals": 4
},
{
"name": "Soony Saad",
"goals": 3
},
{
"name": "Aurelien Collin",
"goals": 2
},
{
"name": "C.J. Sapong",
"goals": 2
},
{
"name": "Claudio Bieler",
"goals": 2
},
{
"name": "Lawrence Olum",
"goals": 2
},
{
"name": "Jacob Peterson",
"goals": 2
},
{
"name": "Paulo Nagamura",
"goals": 2
},
{
"name": "Antonio Dovale",
"goals": 1
}
]
},
{
"name": "LA",
"children": [
{
"name": "Robbie Keane",
"goals": 19
},
{
"name": "Gyasi Zardes",
"goals": 16
},
{
"name": "Landon Donovan",
"goals": 10
},
{
"name": "Alan Gordon",
"goals": 5
},
{
"name": "Baggio Husidic",
"goals": 5
},
{
"name": "Stefan Ishizaki",
"goals": 5
},
{
"name": "Omar Gonzalez",
"goals": 4
},
{
"name": "Marcelo Sarvas",
"goals": 3
},
{
"name": "Leonardo",
"goals": 1
}
]
},
{
"name": "NE",
"children": [
{
"name": "Lee Nguyen",
"goals": 18
},
{
"name": "Diego Fagundez",
"goals": 5
},
{
"name": "Kelyn Rowe",
"goals": 5
},
{
"name": "Patrick Mullins",
"goals": 4
},
{
"name": "Teal Bunbury",
"goals": 4
},
{
"name": "Charlie Davies",
"goals": 3
},
{
"name": "A.J. Soares",
"goals": 2
},
{
"name": "Jermaine Jones",
"goals": 2
},
{
"name": "Jerry Bengtson",
"goals": 1
},
{
"name": "Jose Goncalves",
"goals": 1
},
{
"name": "Darrius Barnes",
"goals": 1
},
{
"name": "Kevin Alston",
"goals": 1
},
{
"name": "Chris Tierney",
"goals": 1
}
]
},
{
"name": "SEA",
"children": [
{
"name": "Obafemi Martins",
"goals": 17
},
{
"name": "Clint Dempsey",
"goals": 15
},
{
"name": "Lamar Neagle",
"goals": 9
},
{
"name": "Chad Barrett",
"goals": 7
},
{
"name": "Marco Pappa",
"goals": 6
},
{
"name": "Andy Rose",
"goals": 3
},
{
"name": "Kenny Cooper",
"goals": 3
},
{
"name": "Gonzalo Pineda",
"goals": 3
},
{
"name": "Chad Marshall",
"goals": 1
}
]
},
{
"name": "CHV",
"children": [
{
"name": "Erick Torres",
"goals": 15
},
{
"name": "Felix Borja",
"goals": 3
},
{
"name": "Marvin Chavez",
"goals": 2
},
{
"name": "Marky Delgado",
"goals": 2
},
{
"name": "Jhon Kennedy Hurtado",
"goals": 1
},
{
"name": "Bobby Burling",
"goals": 1
},
{
"name": "Agustin Pelletieri",
"goals": 1
},
{
"name": "Thomas McNamara",
"goals": 1
},
{
"name": "Ryan Finley",
"goals": 1
},
{
"name": "Kris Tyrpak",
"goals": 1
},
{
"name": "Leandro Barrera",
"goals": 1
}
]
},
{
"name": "SJ",
"children": [
{
"name": "Chris Wondolowski",
"goals": 14
},
{
"name": "Atiba Harris",
"goals": 4
},
{
"name": "Cordell Cato",
"goals": 3
},
{
"name": "Yannick Djalo",
"goals": 3
},
{
"name": "Sam Cronin",
"goals": 2
},
{
"name": "Victor Bernardez",
"goals": 2
},
{
"name": "Khari Stephenson",
"goals": 2
},
{
"name": "Jean-Baptiste Pierazzi",
"goals": 1
},
{
"name": "Steven Lenhart",
"goals": 1
},
{
"name": "Matias Perez Garcia",
"goals": 1
},
{
"name": "Shea Salinas",
"goals": 1
}
]
},
{
"name": "RSL",
"children": [
{
"name": "Joao Plata",
"goals": 13
},
{
"name": "Javier Morales",
"goals": 9
},
{
"name": "Alvaro Saborio",
"goals": 8
},
{
"name": "Luke Mulholland",
"goals": 6
},
{
"name": "Kyle Beckerman",
"goals": 3
},
{
"name": "Olmes Garcia",
"goals": 3
},
{
"name": "Chris Schuler",
"goals": 3
},
{
"name": "Luis Gil",
"goals": 2
},
{
"name": "Ned Grabavoy",
"goals": 2
},
{
"name": "Nat Borchers",
"goals": 1
},
{
"name": "Carlos Salcedo",
"goals": 1
},
{
"name": "Robbie Findley",
"goals": 1
},
{
"name": "Sebastian Velasquez",
"goals": 1
}
]
},
{
"name": "PHI",
"children": [
{
"name": "Sebastien Le Toux",
"goals": 12
},
{
"name": "Conor Casey",
"goals": 8
},
{
"name": "Andrew Wenger",
"goals": 7
},
{
"name": "Maurice Edu",
"goals": 3
},
{
"name": "Danny Cruz",
"goals": 3
},
{
"name": "Sheanon Williams",
"goals": 3
},
{
"name": "Pedro Ribeiro",
"goals": 2
},
{
"name": "Leo Fernandes",
"goals": 2
},
{
"name": "Brian Brown",
"goals": 2
},
{
"name": "Amobi Okugo",
"goals": 2
},
{
"name": "Vincent Nogueira",
"goals": 2
},
{
"name": "Cristian Maidana",
"goals": 2
},
{
"name": "Fred",
"goals": 1
},
{
"name": "Zach Pfeffer",
"goals": 1
}
]
},
{
"name": "POR",
"children": [
{
"name": "Diego Valeri",
"goals": 11
},
{
"name": "Maximiliano Urruti",
"goals": 10
},
{
"name": "Fanendo Adi",
"goals": 9
},
{
"name": "Gaston Fernandez",
"goals": 7
},
{
"name": "Will Johnson",
"goals": 6
},
{
"name": "Rodney Wallace",
"goals": 5
},
{
"name": "Liam Ridgewell",
"goals": 2
},
{
"name": "Alvas Powell",
"goals": 2
},
{
"name": "Diego Chara",
"goals": 2
},
{
"name": "Pa Modou Kah",
"goals": 1
},
{
"name": "Kalif Alhassan",
"goals": 1
},
{
"name": "Jorge Villafana",
"goals": 1
},
{
"name": "Darlington Nagbe",
"goals": 1
}
]
},
{
"name": "CLB",
"children": [
{
"name": "Federico Higuain",
"goals": 11
},
{
"name": "Ethan Finlay",
"goals": 11
},
{
"name": "Justin Meram",
"goals": 8
},
{
"name": "Bernardo Anor",
"goals": 6
},
{
"name": "Jairo Arrieta",
"goals": 5
},
{
"name": "Aaron Schoenfeld",
"goals": 3
},
{
"name": "Adam Bedell",
"goals": 2
},
{
"name": "Giancarlo Gonzalez",
"goals": 1
},
{
"name": "Agustin Viana",
"goals": 1
},
{
"name": "Ben Speas",
"goals": 1
},
{
"name": "Wil Trapp",
"goals": 1
},
{
"name": "Hector Jimenez",
"goals": 1
}
]
},
{
"name": "DAL",
"children": [
{
"name": "Blas Perez",
"goals": 11
},
{
"name": "Fabian Castillo",
"goals": 10
},
{
"name": "Michel",
"goals": 8
},
{
"name": "Tesho Akindele",
"goals": 7
},
{
"name": "David Texeira",
"goals": 4
},
{
"name": "Je-Vaughn Watson",
"goals": 4
},
{
"name": "Mauro Diaz",
"goals": 3
},
{
"name": "Matt Hedges",
"goals": 3
},
{
"name": "Andres Escobar",
"goals": 2
},
{
"name": "Zach Loyd",
"goals": 1
}
]
},
{
"name": "HOU",
"children": [
{
"name": "Giles Barnes",
"goals": 11
},
{
"name": "Will Bruin",
"goals": 10
},
{
"name": "Ricardo Clark",
"goals": 4
},
{
"name": "Brad Davis",
"goals": 4
},
{
"name": "Omar Cummings",
"goals": 3
},
{
"name": "Boniek Garcia",
"goals": 2
},
{
"name": "Mark Sherrod",
"goals": 2
},
{
"name": "David Horst",
"goals": 1
}
]
},
{
"name": "DC",
"children": [
{
"name": "Luis Silva",
"goals": 11
},
{
"name": "Fabian Espindola",
"goals": 11
},
{
"name": "Eddie Johnson",
"goals": 7
},
{
"name": "Chris Rolfe",
"goals": 6
},
{
"name": "Perry Kitchen",
"goals": 5
},
{
"name": "Davy Arnaud",
"goals": 2
},
{
"name": "Nick DeLeon",
"goals": 2
},
{
"name": "Chris Pontius",
"goals": 1
},
{
"name": "Taylor Kemp",
"goals": 1
},
{
"name": "Bobby Boswell",
"goals": 1
},
{
"name": "Sean Franklin",
"goals": 1
}
]
},
{
"name": "TOR",
"children": [
{
"name": "Jermain Defoe",
"goals": 11
},
{
"name": "Gilberto",
"goals": 7
},
{
"name": "Luke Moore",
"goals": 6
},
{
"name": "Jackson",
"goals": 4
},
{
"name": "Jonathan Osorio",
"goals": 3
},
{
"name": "Nick Hagglund",
"goals": 2
},
{
"name": "Michael Bradley",
"goals": 2
},
{
"name": "Dominic Oduro",
"goals": 2
},
{
"name": "Doneil Henry",
"goals": 1
},
{
"name": "Warren Creavalle",
"goals": 1
},
{
"name": "Dwayne De Rosario",
"goals": 1
},
{
"name": "Bradley Orr",
"goals": 1
}
]
},
{
"name": "VAN",
"children": [
{
"name": "Pedro Morales",
"goals": 10
},
{
"name": "Darren Mattocks",
"goals": 6
},
{
"name": "Sebastian Fernandez",
"goals": 5
},
{
"name": "Erik Hurtado",
"goals": 5
},
{
"name": "Kekuta Manneh",
"goals": 4
},
{
"name": "Kenny Miller",
"goals": 3
},
{
"name": "Jordan Harvey",
"goals": 2
},
{
"name": "Kendall Waston",
"goals": 2
},
{
"name": "Nicolas Mezquida",
"goals": 2
},
{
"name": "Carlyle Mitchell",
"goals": 1
},
{
"name": "Gershon Koffie",
"goals": 1
}
]
},
{
"name": "COL",
"children": [
{
"name": "Deshorn Brown",
"goals": 10
},
{
"name": "Vicente Sanchez",
"goals": 6
},
{
"name": "Dillon Powers",
"goals": 5
},
{
"name": "Jose Mari",
"goals": 4
},
{
"name": "Dillon Serna",
"goals": 3
},
{
"name": "Gabriel Torres",
"goals": 3
},
{
"name": "Kamani Hill",
"goals": 2
},
{
"name": "Drew Moor",
"goals": 2
},
{
"name": "Edson Buddle",
"goals": 2
},
{
"name": "Shane O'Neill",
"goals": 1
},
{
"name": "John Neeskens",
"goals": 1
},
{
"name": "Nick LaBrocca",
"goals": 1
},
{
"name": "Marlon Hairston",
"goals": 1
},
{
"name": "Marc Burch",
"goals": 1
}
]
},
{
"name": "MTL",
"children": [
{
"name": "Marco Di Vaio",
"goals": 9
},
{
"name": "Jack McInerney",
"goals": 8
},
{
"name": "Andres Romero",
"goals": 6
},
{
"name": "Ignacio Piatti",
"goals": 4
},
{
"name": "Dilly Duka",
"goals": 3
},
{
"name": "Felipe Martins",
"goals": 3
},
{
"name": "Issey Nakajima-Farran",
"goals": 2
},
{
"name": "Maxim Tissot",
"goals": 2
},
{
"name": "Hassoun Camara",
"goals": 1
},
{
"name": "Mamadou Danso",
"goals": 1
},
{
"name": "Calum Mallace",
"goals": 1
}
]
},
{
"name": "CHI",
"children": [
{
"name": "Quincy Amarikwa",
"goals": 8
},
{
"name": "Mike Magee",
"goals": 7
},
{
"name": "Harry Shipp",
"goals": 7
},
{
"name": "Jeff Larentowicz",
"goals": 6
},
{
"name": "Robert Earnshaw",
"goals": 3
},
{
"name": "Juan Luis Anangono",
"goals": 2
},
{
"name": "Sanna Nyassi",
"goals": 2
},
{
"name": "Benji Joya",
"goals": 1
},
{
"name": "Florent Sinama-Pongolle",
"goals": 1
},
{
"name": "Lovel Palmer",
"goals": 1
},
{
"name": "Matt Watson",
"goals": 1
},
{
"name": "Grant Ward",
"goals": 1
},
{
"name": "Patrick Nyarko",
"goals": 1
}
]
}
]
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>MLS goals 2014</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href='http://fonts.googleapis.com/css?family=News+Cycle:400' rel='stylesheet' type='text/css'>
<style>
path {
stroke: #bbb;
fill-rule: evenodd;
cursor:pointer;
}
text {
font-family: 'News Cycle', sans-serif;
font-size:12px;
fill:#fff;
cursor:pointer;
}
</style>
</head>
<body>
<div id="output"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script>
var width = 960,
height = 700,
radius = Math.min(width, height) / 2;
var x = d3.scale.linear()
.range([0, 2 * Math.PI]);
var y = d3.scale.linear()
.range([0, radius]);
var color = d3.scale.ordinal()
.domain(["MLS", "NY", "KC", "LA", "NE", "SEA", "CHV", "SJ", "RSL", "PHI", "POR", "CLB", "DAL", "HOU", "DC", "TOR", "VAN", "COL", "MTL", "CHI"])
.range(["gray", "firebrick", "lightblue", "navy", "navy", "limegreen", "firebrick", "blue", "darkred", "navy", "darkgreen", "gold", "firebrick", "orange", "black", "firebrick", "navy", "maroon", "blue", "firebrick"]);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + (height / 2) + ")");
var partition = d3.layout.partition()
.value(function(d) { return d.goals; });
var arc = d3.svg.arc()
.startAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x))); })
.endAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx))); })
.innerRadius(function(d) { return Math.max(0, y(d.y)); })
.outerRadius(function(d) { return Math.max(0, y(d.y + d.dy)); });
d3.json("goals.json", function(error, root) {
var g = svg.selectAll("g")
.data(partition.nodes(root))
.enter().append("g");
var path = g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color((d.children ? d : d.parent).name); })
.on("click", click);
var text = g.append("text")
.attr("transform", function(d) { return "rotate(" + computeTextRotation(d) + ")"; })
.attr("x", function(d) { return y(d.y); })
.attr("dx", "6") // margin
.attr("dy", ".35em") // vertical-align
.text(function(d) { if (!d.children) { return d.name + " (" + d.goals + ")"} else {return d.name}});
function click(d) {
// fade out all text elements
text.transition().attr("opacity", 0);
path.transition()
.duration(750)
.attrTween("d", arcTween(d))
.each("end", function(e, i) {
// check if the animated element's data e lies within the visible angle span given in d
if (e.x >= d.x && e.x < (d.x + d.dx)) {
// get a selection of the associated text element
var arcText = d3.select(this.parentNode).select("text");
// fade in the text element and recalculate positions
arcText.transition().duration(750)
.attr("opacity", 1)
.attr("transform", function() { return "rotate(" + computeTextRotation(e) + ")" })
.attr("x", function(d) { return y(d.y); });
}
});
}
});
d3.select(self.frameElement).style("height", height + "px");
// Interpolate the scales!
function arcTween(d) {
var xd = d3.interpolate(x.domain(), [d.x, d.x + d.dx]),
yd = d3.interpolate(y.domain(), [d.y, 1]),
yr = d3.interpolate(y.range(), [d.y ? 20 : 0, radius]);
return function(d, i) {
return i
? function(t) { return arc(d); }
: function(t) { x.domain(xd(t)); y.domain(yd(t)).range(yr(t)); return arc(d); };
};
}
function computeTextRotation(d) {
return (x(d.x + d.dx / 2) - Math.PI / 2) / Math.PI * 180;
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment