Skip to content

Instantly share code, notes, and snippets.

@jmharkins
Last active December 26, 2015 09:08
Show Gist options
  • Save jmharkins/7126718 to your computer and use it in GitHub Desktop.
Save jmharkins/7126718 to your computer and use it in GitHub Desktop.
Premier League Goals 2012-13

This chart displays the goals scored in the 2012-13 Barclays Premier League season. Click on a team to view their goalscorers on the season. Return to the league view by clicking in the blank space near the chart

Made by Johannes Harkins using d3

[{"club":"Manchester United","gf":86, "col":"red", "players": [
{"name":"Robin Van Persie","g":26},
{"name":"Wayne Rooney","g":12},
{"name":"Javier Hernandez","g":10},
{"name":"Shinji Kagawa","g":6},
{"name":"Patrice Evra","g":4},
{"name":"Rafael","g":3},
{"name":"Jonny Evans","g":3},
{"name":"Tom Cleverley","g":2},
{"name":"Ryan Giggs","g":2},
{"name":"Alexander Buttner","g":2},
{"name":"Michael Carrick","g":1},
{"name":"Rio Ferdinand","g":1},
{"name":"Danny Welbeck","g":1},
{"name":"Darren Fletcher","g":1},
{"name":"Nemanja Vidic","g":1},
{"name":"Antonio Valencia","g":1},
{"name":"Nick Powell","g":1},
{"name":"Nani","g":1},
{"name":"Anderson","g":1},
{"name":"Paul Scholes","g":1}
]},
{"club":"Chelsea","gf":75, "col":"blue", "players": [
{"name":"Frank Lampard","g":15},
{"name":"Juan Mata","g":12},
{"name":"Eden Hazard","g":9},
{"name":"Fernando Torres","g":8},
{"name":"Ramires","g":5},
{"name":"Branislav Ivanovic","g":5},
{"name":"Oscar","g":4},
{"name":"John Terry","g":4},
{"name":"David Luiz","g":2},
{"name":"Gary Cahill","g":2},
{"name":"Demba Ba","g":2},
{"name":"Victor Moses","g":1},
{"name":"Ashley Cole","g":1},
{"name":"Daniel Sturridge","g":1},
{"name":"Marko Marin","g":1}
]},
{"club":"Arsenal","gf":72, "col":"red","players":[
{"name":"Theo Walcott","g":14},
{"name":"Santi Cazorla","g":12},
{"name":"Olivier Giroud","g":11},
{"name":"Lukas Podolski","g":11},
{"name":"Mikel Arteta","g":6},
{"name":"Gervinho","g":5},
{"name":"Per Mertesacker","g":3},
{"name":"Laurent Koscielny","g":2},
{"name":"Tomas Rosicky","g":2},
{"name":"Nacho Monreal","g":1},
{"name":"Aaron Ramsey","g":1},
{"name":"Alex Oxlade-Chamberlain","g":1}
]},
{"club":"Liverpool","gf":71, "col":"red", "players": [
{"name":"Luis Suarez","g":23},
{"name":"Daniel Sturridge","g":10},
{"name":"Steven Gerrard","g":9},
{"name":"Jordan Henderson","g":5},
{"name":"Daniel Agger","g":3},
{"name":"Philippe Coutinho","g":3},
{"name":"Stewart Downing","g":3},
{"name":"Raheem Sterling","g":2},
{"name":"Jose Enrique","g":2},
{"name":"Martin Skrtel","g":2},
{"name":"Glen Johnson","g":1},
{"name":"Jonjo Shelvey","g":1},
{"name":"Nuri Sahin","g":1},
{"name":"Fabio Borini","g":1},
{"name":"Joe Cole","g":1}
]},
{"club":"Manchester City","gf":66,"col":"deepskyblue", "players": [
{"name":"Edin Dzeko","g":14},
{"name":"Sergio Aguero","g":12},
{"name":"Carlos Tevez","g":11},
{"name":"Yaya Toure","g":6},
{"name":"David Silva","g":4},
{"name":"James Milner","g":4},
{"name":"Jack Rodwell","g":2},
{"name":"Pablo Zabaleta","g":2},
{"name":"Samir Nasri","g":2},
{"name":"Javi Garcia","g":2},
{"name":"Vincent Kompany","g":1},
{"name":"Gareth Barry","g":1},
{"name":"Mario Balotelli","g":1},
{"name":"Joleon Lescott","g":1},
{"name":"Aleksandar Kolarov","g":1}
]},
{"club":"Tottenham Hotspur","gf":66,"col":"navy", "players":[
{"name":"Gareth Bale","g":21},
{"name":"Jermain Defoe","g":11},
{"name":"Clint Dempsey","g":7},
{"name":"Emmanuel Adebayor","g":5},
{"name":"Aaron Lennon","g":4},
{"name":"Jan Vertonghen","g":4},
{"name":"Gylfi Sigurdsson","g":3},
{"name":"Steven Caulker","g":2},
{"name":"Michael Dawson","g":1},
{"name":"Moussa Dembele","g":1},
{"name":"William Gallas","g":1},
{"name":"Benoit Assou-Ekotto","g":1},
{"name":"Sandro","g":1}
]},
{"club":"Everton","gf":55,"col":"blue", "players": [
{"name":"Marouane Fellaini","g":11},
{"name":"Nikica Jelavic","g":7},
{"name":"Victor Anichebe","g":6},
{"name":"Steven Pienaar","g":6},
{"name":"Kevin Mirallas","g":6},
{"name":"Leon Osman","g":5},
{"name":"Leighton Baines","g":5},
{"name":"Steven Naismith","g":4},
{"name":"Phil Jagielka","g":2},
{"name":"Darron Gibson","g":1}
]},
{"club":"West Bromwich Albion","gf":53,"col":"navy", "players":[
{"name":"Romelu Lukaku","g":17},
{"name":"Shane Long","g":8},
{"name":"James Morrison","g":5},
{"name":"Peter Odemwingie","g":5},
{"name":"Zoltan Gera","g":4},
{"name":"Gareth McAuley","g":3},
{"name":"Marc-Antoine Fortune","g":2},
{"name":"Chris Brunt","g":2},
{"name":"Youssouf Mulumbu","g":2},
{"name":"Graham Dorrans","g":1},
{"name":"Billy Jones","g":1}
]},
{"club":"Fulham","gf":50,"col":"black", "players": [
{"name":"Dimitar Berbatov","g":15},
{"name":"Bryan Ruiz","g":5},
{"name":"Mladen Petric","g":5},
{"name":"Steve Sidwell","g":4},
{"name":"Alex Kacaniklic","g":4},
{"name":"Damien Duff","g":3},
{"name":"Hugo Rodallega","g":3},
{"name":"Chris Baird","g":2},
{"name":"Giorgos Karagounis","g":1},
{"name":"Kieran Richardson","g":1},
{"name":"Sascha Riether","g":1},
{"name":"Urby Emanuelson","g":1}
]},
{"club":"Southampton","gf":49,"col":"red", "players": [
{"name":"Rickie Lambert","g":15},
{"name":"Jason Puncheon","g":6},
{"name":"Jay Rodriguez","g":6},
{"name":"Morgan Schneiderlin","g":5},
{"name":"Gaston Ramirez","g":5},
{"name":"Adam Lallana","g":3},
{"name":"Jose Fonte","g":2},
{"name":"Steven Davis","g":2},
{"name":"Nathaniel Clyne","g":1},
{"name":"Daniel Fox","g":1}
]},
{"club":"Swansea City","gf":47,"col":"black", "players": [
{"name":"Michu","g":18},
{"name":"Jonathan De Guzman","g":5},
{"name":"Wayne Routledge","g":5},
{"name":"Angel Rangel","g":3},
{"name":"Luke Moore","g":3},
{"name":"Nathan Dyer","g":3},
{"name":"Pablo Hernandez","g":3},
{"name":"Danny Graham","g":3},
{"name":"Itay Shechter","g":1},
{"name":"Scott Sinclair","g":1},
{"name":"Dwight Tiendalli","g":1},
{"name":"Ben Davies","g":1}
]},
{"club":"Aston Villa","gf":47,"col":"maroon", "players":[
{"name":"Christian Benteke","g":19},
{"name":"Gabriel Agbonlahor","g":9},
{"name":"Andreas Weimann","g":7},
{"name":"Darren Bent","g":3},
{"name":"Ron Vlaar","g":2},
{"name":"Matthew Lowton","g":2},
{"name":"Charles N'Zogbia","g":2},
{"name":"Brett Holman","g":1},
{"name":"Karim El Ahmadi","g":1}
]},
{"club":"Wigan Athletic","gf":47,"col":"royalblue", "players": [
{"name":"Arouna Kone","g":11},
{"name":"Shaun Maloney","g":6},
{"name":"Franco Di Santo","g":5},
{"name":"Emmerson Boyce","g":4},
{"name":"Jordi Gomez","g":3},
{"name":"James McCarthy","g":3},
{"name":"James McArthur","g":3},
{"name":"Ivan Ramis","g":2},
{"name":"Callum McManaman","g":2},
{"name":"Ben Watson","g":1},
{"name":"Jean Beausejour","g":1},
{"name":"Maynor Figueroa","g":1},
{"name":"Gary Caldwell","g":1},
{"name":"Roger Espinoza","g":1},
{"name":"Angelo Henriquez","g":1}
]},
{"club":"West Ham United","gf":45,"col":"maroon", "players":[
{"name":"Kevin Nolan","g":10},
{"name":"Andy Carroll","g":7},
{"name":"Mark Noble","g":4},
{"name":"Mohamed Diame","g":3},
{"name":"Ricardo Vaz Te","g":3},
{"name":"Joey O'Brien","g":2},
{"name":"Joe Cole","g":2},
{"name":"Matthew Jarvis","g":2},
{"name":"Modibo Maiga","g":2},
{"name":"Carlton Cole","g":2},
{"name":"Jack Collison","g":2},
{"name":"Gary O'Neil","g":1},
{"name":"Winston Reid","g":1},
{"name":"James Tomkins","g":1},
{"name":"Matthew Taylor","g":1}
]},
{"club":"Newcastle United","gf":45,"col":"black","players": [
{"name":"Demba Ba","g":13},
{"name":"Papiss Cisse","g":8},
{"name":"Yohan Cabaye","g":6},
{"name":"Hatem Ben Arfa","g":4},
{"name":"Yoan Gouffran","g":3},
{"name":"Moussa Sissoko","g":3},
{"name":"James Perch","g":1},
{"name":"Shola Ameobi","g":1},
{"name":"Jonas Gutierrez","g":1},
{"name":"Sylvain Marveaux","g":1},
{"name":"Davide Santon","g":1},
{"name":"Gael Bigirimana","g":1}
]},
{"club":"Reading","gf":43,"col":"blue","players": [
{"name":"Adam Le Fondre","g":12},
{"name":"Hal Robson-Kanu","g":7},
{"name":"Pavel Pogrebnyak","g":5},
{"name":"Jimmy Kebe","g":5},
{"name":"Garath McCleary","g":3},
{"name":"Sean Morrison","g":2},
{"name":"Noel Hunt","g":2},
{"name":"Kaspars Gorkss","g":1},
{"name":"Danny Guthrie","g":1},
{"name":"Jem Karacan","g":1},
{"name":"Mikele Leigertwood","g":1},
{"name":"Adrian Mariappa","g":1}
]},
{"club":"Norwich City","gf":41,"col":"green", "players":[
{"name":"Grant Holt","g":8},
{"name":"Robert Snodgrass","g":6},
{"name":"Anthony Pilkington","g":5},
{"name":"Sebastien Bassong","g":3},
{"name":"Russell Martin","g":3},
{"name":"Wesley Hoolahan","g":3},
{"name":"Michael Turner","g":3},
{"name":"Jonathan Howson","g":2},
{"name":"Bradley Johnson","g":1},
{"name":"Steve Morison","g":1},
{"name":"Kei Kamara","g":1},
{"name":"Elliott Bennett","g":1},
{"name":"Ryan Bennett","g":1},
{"name":"Simeon Jackson","g":1},
{"name":"Steven Whittaker","g":1}
]},
{"club":"Sunderland","gf":41,"col":"red", "players": [
{"name":"Steven Fletcher","g":11},
{"name":"Stephane Sessegnon","g":7},
{"name":"Craig Gardner","g":6},
{"name":"Adam Johnson","g":5},
{"name":"John O'Shea","g":2},
{"name":"James McClean","g":2},
{"name":"David Vaughan","g":1},
{"name":"Fraizer Campbell","g":1},
{"name":"Carlos Cuellar","g":1},
{"name":"Danny Rose","g":1},
{"name":"Sebastian Larsson","g":1},
{"name":"Phil Bardsley","g":1}
]},
{"club":"Stoke City","gf":34,"col":"red", "players": [
{"name":"Jonathan Walters","g":8},
{"name":"Peter Crouch","g":7},
{"name":"Charlie Adam","g":3},
{"name":"Cameron Jerome","g":3},
{"name":"Kenwyne Jones","g":3},
{"name":"Michael Kightly","g":3},
{"name":"Steven Nzonzi","g":1},
{"name":"Matthew Upson","g":1},
{"name":"Michael Owen","g":1},
{"name":"Ryan Shawcross","g":1},
{"name":"Dean Whitehead","g":1},
{"name":"Robert Huth","g":1}
]},
{"club":"Queens Park Rangers","gf":30,"col":"blue","players":[
{"name":"Loïc Remy","g":6},
{"name":"Adel Taarabt","g":5},
{"name":"Bobby Zamora","g":4},
{"name":"Djibril Cisse","g":3},
{"name":"Jamie Mackie","g":2},
{"name":"Andros Townsend","g":2},
{"name":"Jermaine Jenas","g":2},
{"name":"Esteban Granero","g":1},
{"name":"Junior Hoilett","g":1},
{"name":"Ryan Nelsen","g":1},
{"name":"Shaun Wright-Phillips","g":1},
{"name":"Jay Bothroyd","g":1}
]}]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Premier League Goals 2013</title>
<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
<style type="text/css">
h1, h5 {font-family: sans-serif}
#footer {
clear: both;
position: ;
z-index: 10;
height: 3em;
margin-top: -3em;
}
</style>
</head>
<body>
<div id = "container">
<script type="text/javascript">
var w = 500
var h = 400
var barh = 20
var m = [0,0,0,500]
var tdata;
var cdata;
var dataset;
var subdata;
var teamcol;
var state = 0;
//define svg function
var svg = d3.select("body")
.append("svg")
.attr("width", w + m[3])
.attr("height", h);
//place background rect
svg.append("rect")
.attr("class", "background")
.attr("width", w + m[3])
.attr("height",h)
.attr("fill", "white")
.on("click", function() {
return up(tdata)
});
d3.json("dta.json", function(error, data) {
if (error) { //If error is not null, something went wrong.
console.log(error);
}
else {
tdata = data;
console.log(tdata);
up(tdata);
// set state to 0
var state = 0;
// place first bars
// return up(tdata);
}
});
var up = function (dta) {
if (state === 1) {
}
else {
if (state === 2) {
console.log("Hello");
//remove text
d3.selectAll("text")
.remove();
// remove lines
d3.selectAll("line")
.remove();
// remove rectangles
svg.selectAll(".b2")
.attr("fill", function() {
return teamcol;
})
.on("mouseover", function() {
})
.transition()
.duration(1000)
.delay( function(d,i){
return i * (1000 / subdata.length);
})
.attr("y", -50) // want to have bars exit differently?
.remove();
}
//key fns
var club = function(d) {
return d.club;
};
var gf = function(d) {
return d.gf
};
var col = function(d) {
return d.col
};
var players = function(d) {
return d.players
};
dataset = dta;
// set scales
var yScale = d3.scale.ordinal()
.domain(d3.range(dataset.length))
.rangeRoundBands([0, h], 0.05);
var xScale = d3.scale.linear()
.domain([0, d3.max(dataset, function(d) {
return d.gf;
})])
.range([0, w]);
// adding rectangles
svg.selectAll("g")
.data(dataset, club)
.enter()
.append("rect")
.attr("class", "b1")
.attr("id", function(d) {
return d.club;
})
.attr("ccol", function(d) {
return d.col;
})
.attr("width", function(d) {
return xScale(d.gf)
})
.attr("height", yScale.rangeBand())
.attr("fill", "steelblue")
.attr("opacity", 0.85);
if (state === 0) {
d3.selectAll(".b1")
.attr("y", function(d, i) {
return yScale(i);
});
} else {
d3.selectAll(".b1")
.attr("y", h + 50)
.transition()
.duration(2000)
.delay(function(d, i) {
return 1000 + (i+1)*(1000 /tdata.length);
})
.attr("y", function(d, i) {
return yScale(i);
}); ;
}
// generate text
svg.selectAll("text")
.data(dataset, club)
.enter()
.append("text")
.text(function(d) {
return d.gf;
})
.attr("text-anchor", "end")
.attr("x", function(d) {
return xScale(d.gf) - 5;
})
.attr("font-family", "sans-serif")
.attr("font-size", "11px")
.attr("fill", "gainsboro");
if (state == 2) {
svg.selectAll("text").transition()
.duration(3500)
.delay(3500)
.attr("y", function(d, i) {
return yScale(i) + (yScale.rangeBand() / 2) + 2;
});
}
else {
svg.selectAll("text").attr("y", function(d, i) {
return yScale(i) + (yScale.rangeBand() / 2) + 2;
});
}
// mouse over interaction
d3.selectAll(".b1")
.on("mouseover", function(d, i) {
// dim other bars
d3.selectAll(".b1")
.filter(function(datum, j) {
return i != j;
})
.style("opacity", .2);
// dim other text
d3.selectAll("text")
.filter(function(datum, j) {
return i != j;
})
.style("opacity", .35);
//add line
var xPlace = parseInt(d3.select(this).attr("width")) + 5;
var yStart = parseInt(d3.select(this).attr("y")) + yScale.rangeBand() / 2;
var clubnm = d3.select(this).attr("id");
svg.append("line")
.attr("id", "cpointer")
.attr("x1", xPlace)
.attr("x2", xPlace)
.attr("y1", yStart)
.attr("y2", yStart)
.attr("stroke", "black")
.transition()
.duration(250)
.attr("x2", 700);
//add club name
svg.append("text")
.attr("id","clubname")
.transition()
.delay(250)
.text(clubnm)
.attr("x", 700 + 5)
.attr("y", yStart + 3.5)
.attr("font-family", "sans-serif")
.attr("font-size", "11px")
.attr("fill", "black");
})
// mouse out
.on("mouseout", function(d) {
d3.selectAll(".b1")
.style("opacity", 0.85)
.attr("fill", "steelblue");
d3.selectAll("text")
.style("opacity", 1);
d3.select("#cpointer").remove();
d3.select("#clubname").remove();
})
// click
.on("click", function(d) {
subdata = d.players;
console.log(subdata);
teamcol = d.col;
down(subdata);
});
// set state to 1
state = 1;
}};
var down = function (subdataset) {
state = 2;
console.log(teamcol);
var yScale = d3.scale.ordinal()
.domain(d3.range(subdataset.length))
.rangeRoundBands([0, h], 0.05);
var xScale = d3.scale.linear()
.domain([0, d3.max(subdataset, function(d) {
return d.g;
})])
.range([0, w]);
var name = function(d) {
return d.name;
};
var g = function(d) {
return d.g;
};
// remove text
d3.selectAll("text")
.remove();
// remove lines
d3.selectAll("line")
.remove();
// transition out old bars
svg.selectAll(".b1")
.on("mouseover", function() {
})
.transition()
.duration(1000)
.delay(function(d,i) {
return (1000/tdata.length) * (i + 1)
})
.attr("y", -50)
.remove();
// add rectangles
svg.selectAll("g")
.data(subdataset, name)
.enter()
.append("rect")
.attr("class","b2")
.attr("id", function(d) {
return d.name
})
.attr("y", 450)
.attr("width", function(d) {
return xScale(d.g);
})
.attr("height", function() {
return yScale.rangeBand();
})
.attr("fill", function() {
return teamcol;
})
.attr("opacity", 0.85)
.transition()
.duration(2000)
.delay( function(d,i) {
return 1000 + ((i+1) * (1000/subdataset.length));
})
.attr("y", function(d, i) {
return yScale(i);
});
// generate text
svg.selectAll("text")
.data(subdataset)
.enter()
.append("text")
.text(function(d) {
return d.g;
})
.attr("text-anchor", "end")
.attr("x", function(d) {
return xScale(d.g) - 5;
})
.attr("font-family", "sans-serif")
.attr("font-size", "11px")
.attr("fill", "gainsboro")
.transition()
.duration(3500)
.delay(3500)
.attr("y", function(d, i) {
return yScale(i) + (yScale.rangeBand() / 2) + 2;
});
// mouse over interaction
d3.selectAll(".b2")
.on("mouseover", function(d, i) {
// dim other bars
d3.selectAll(".b2")
.filter(function(datum, j) {
return i != j;
})
.style("opacity", .2);
// dim other text
d3.selectAll("text")
.filter(function(datum, j) {
return i != j;
})
.style("opacity", .35);
//add line
var xPlace = parseInt(d3.select(this).attr("width")) + 5;
var yStart = parseInt(d3.select(this).attr("y")) + yScale.rangeBand() / 2;
var playernm = d3.select(this).attr("id");
svg.append("line")
.attr("id", "playerpointer")
.attr("x1", xPlace)
.attr("x2", xPlace)
.attr("y1", yStart)
.attr("y2", yStart)
.attr("stroke", "black")
.transition()
.duration(250)
.attr("x2", 700);
//add club name
svg.append("text")
.attr("id","playername")
.transition()
.delay(250)
.text(playernm)
.attr("x", 700 + 5)
.attr("y", yStart + 3.5)
.attr("font-family", "sans-serif")
.attr("font-size", "11px")
.attr("fill", "black");
})
// mouse out
.on("mouseout", function(d) {
d3.selectAll(".b2")
.style("opacity", 0.85)
.attr("fill", function() {
return teamcol;
});
d3.selectAll("text")
.style("opacity", 1);
d3.select("#playerpointer").remove();
d3.select("#playername").remove();
})
};
</script></div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment