Skip to content

Instantly share code, notes, and snippets.

@dianaow
Last active March 30, 2019 14:38
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 dianaow/13cb6d8150bede86762722ab68eecba3 to your computer and use it in GitHub Desktop.
Save dianaow/13cb6d8150bede86762722ab68eecba3 to your computer and use it in GitHub Desktop.
D3 Force Layout: Foreign players connected to Chinese Super League teams V2
license: mit

How are professional soccer players from the top 32 countries qualified for the 2018 FIFA World Cup involved in the Chinese Super League?

Hover over any team node to see how players from each country are connected to teams

Used bboxCollision to prevent text overlap of player labels on hover.

Please click 'open' to expand the graph on a new screen.

Built with blockbuilder.org

function bboxCollision(bbox) {
function x (d) {
return d.x + d.vx;
}
function y (d) {
return d.y + d.vy;
}
function constant (x) {
return function () {
return x;
};
}
var nodes,
boundingBoxes,
strength = 1,
iterations = 1;
if (typeof bbox !== "function") {
bbox = constant(bbox === null ? [[0,0][1,1]] : bbox)
}
function force () {
var i,
tree,
node,
xi,
yi,
bbi,
nx1,
ny1,
nx2,
ny2
var cornerNodes = []
nodes.forEach(function (d, i) {
cornerNodes.push({node: d, vx: d.vx, vy: d.vy, x: d.x + (boundingBoxes[i][1][0] + boundingBoxes[i][0][0]) / 2, y: d.y + (boundingBoxes[i][0][1] + boundingBoxes[i][1][1]) / 2})
cornerNodes.push({node: d, vx: d.vx, vy: d.vy, x: d.x + boundingBoxes[i][0][0], y: d.y + boundingBoxes[i][0][1]})
cornerNodes.push({node: d, vx: d.vx, vy: d.vy, x: d.x + boundingBoxes[i][0][0], y: d.y + boundingBoxes[i][1][1]})
cornerNodes.push({node: d, vx: d.vx, vy: d.vy, x: d.x + boundingBoxes[i][1][0], y: d.y + boundingBoxes[i][0][1]})
cornerNodes.push({node: d, vx: d.vx, vy: d.vy, x: d.x + boundingBoxes[i][1][0], y: d.y + boundingBoxes[i][1][1]})
})
var cn = cornerNodes.length
for (var k = 0; k < iterations; ++k) {
tree = d3.quadtree(cornerNodes, x, y).visitAfter(prepareCorners);
for (i = 0; i < cn; ++i) {
var nodeI = ~~(i / 5);
node = nodes[nodeI]
bbi = boundingBoxes[nodeI]
xi = node.x + node.vx
yi = node.y + node.vy
nx1 = xi + bbi[0][0]
ny1 = yi + bbi[0][1]
nx2 = xi + bbi[1][0]
ny2 = yi + bbi[1][1]
tree.visit(apply);
}
}
function apply (quad, x0, y0, x1, y1) {
var data = quad.data
if (data) {
var bWidth = bbLength(bbi, 0),
bHeight = bbLength(bbi, 1);
if (data.node.index !== nodeI) {
var dataNode = data.node
var bbj = boundingBoxes[dataNode.index],
dnx1 = dataNode.x + dataNode.vx + bbj[0][0],
dny1 = dataNode.y + dataNode.vy + bbj[0][1],
dnx2 = dataNode.x + dataNode.vx + bbj[1][0],
dny2 = dataNode.y + dataNode.vy + bbj[1][1],
dWidth = bbLength(bbj, 0),
dHeight = bbLength(bbj, 1)
if (nx1 <= dnx2 && dnx1 <= nx2 && ny1 <= dny2 && dny1 <= ny2) {
var xSize = [Math.min.apply(null, [dnx1, dnx2, nx1, nx2]), Math.max.apply(null, [dnx1, dnx2, nx1, nx2])]
var ySize = [Math.min.apply(null, [dny1, dny2, ny1, ny2]), Math.max.apply(null, [dny1, dny2, ny1, ny2])]
var xOverlap = bWidth + dWidth - (xSize[1] - xSize[0])
var yOverlap = bHeight + dHeight - (ySize[1] - ySize[0])
var xBPush = xOverlap * strength * (yOverlap / bHeight)
var yBPush = yOverlap * strength * (xOverlap / bWidth)
var xDPush = xOverlap * strength * (yOverlap / dHeight)
var yDPush = yOverlap * strength * (xOverlap / dWidth)
if ((nx1 + nx2) / 2 < (dnx1 + dnx2) / 2) {
node.vx -= xBPush
dataNode.vx += xDPush
}
else {
node.vx += xBPush
dataNode.vx -= xDPush
}
if ((ny1 + ny2) / 2 < (dny1 + dny2) / 2) {
node.vy -= yBPush
dataNode.vy += yDPush
}
else {
node.vy += yBPush
dataNode.vy -= yDPush
}
}
}
return;
}
return x0 > nx2 || x1 < nx1 || y0 > ny2 || y1 < ny1;
}
}
function prepareCorners (quad) {
if (quad.data) {
return quad.bb = boundingBoxes[quad.data.node.index]
}
quad.bb = [[0,0],[0,0]]
for (var i = 0; i < 4; ++i) {
if (quad[i] && quad[i].bb[0][0] < quad.bb[0][0]) {
quad.bb[0][0] = quad[i].bb[0][0]
}
if (quad[i] && quad[i].bb[0][1] < quad.bb[0][1]) {
quad.bb[0][1] = quad[i].bb[0][1]
}
if (quad[i] && quad[i].bb[1][0] > quad.bb[1][0]) {
quad.bb[1][0] = quad[i].bb[1][0]
}
if (quad[i] && quad[i].bb[1][1] > quad.bb[1][1]) {
quad.bb[1][1] = quad[i].bb[1][1]
}
}
}
function bbLength (bbox, heightWidth) {
return bbox[1][heightWidth] - bbox[0][heightWidth]
}
force.initialize = function (_) {
var i, n = (nodes = _).length; boundingBoxes = new Array(n);
for (i = 0; i < n; ++i) boundingBoxes[i] = bbox(nodes[i], i, nodes);
};
force.iterations = function (_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function (_) {
return arguments.length ? (strength = +_, force) : strength;
};
force.bbox = function (_) {
return arguments.length ? (bbox = typeof _ === "function" ? _ : constant(+_), force) : bbox;
};
return force;
}
Country Player Star_Player Start_Year End_Year Club_Name_1 Club_Name_2 Description
Argentina José Luis Díaz 2004 2004 Tianjin Teda
Argentina Javier Martin Musa 2006 2006 Beijing Guoan
Argentina Roberto Demus 2006 2006 Wuhan Guanggu
Argentina Matías Marchesini 2008 2008 Shanghai Shenhua
Argentina César La Paglia 2008 2008 Wuhan Guanggu
Argentina Hernán Barcos 2009 2009 Shanghai Shenhua
Argentina Hernán Barcos 2009 2009 Shenzhen FC
Argentina Sebastián Setti 2010 2010 Changchun Yatai
Argentina Matías Villavicencio 2010 2010 Shanghai Shenhua
Argentina Luis Salmerón 2011 2011 Shanghai Shenhua
Argentina Facundo Pérez Castro 2011 2011 Shanghai Shenhua
Argentina Gustavo Rodas 2012 2012 Guizhou HFZC
Argentina Rolando Schiavi 2013 2013 Shanghai Shenhua
Argentina Patricio Toranzo 2013 2013 Shanghai Shenhua
Argentina Pablo Nicolás Caballero 2013 2013 Qingdao Jonoon
Argentina Walter Iglesias 2014 2014 Changchun Yatai
Argentina Lucas Viatri 2014 2014 Shanghai Shenhua
Argentina Esteban Solari 2014 2014 Dalian Yifang
Argentina Hernán Barcos 2015 2015 Tianjin Teda
Argentina Carlos Tevez Star 2017 2017 Shanghai Shenhua Carlos Tevez arrived in Shanghai to a hero's welcome, but his stint in China ended in disaster. The forward, whose former clubs include Manchester United, Manchester City and Juventus, scored just four goals in the Chinese Super League (CSL) and missed half the matches either through injury, or was simply out of form or out of shape.
Argentina Nicolás Aguirre 2018 2018 Chongqing Lifan
Argentina Nicolás Gaitán 2018 2018 Dalian Yifang
Argentina Luciano Olguín 2010 2011 Tianjin Teda
Argentina Marcos Flores 2011 2012 Henan Jianye
Argentina Darío Conca 2011 2013 Guangzhou Evergrande
Argentina Pablo Brandán 2012 2013 Liaoning Whowin
Argentina Leonardo Pisculichi 2012 2013 Shandong Luneng
Argentina Pablo Batalla 2014 2015 Beijing Guoan
Argentina Walter Montillo 2014 2016 Shandong Luneng
Argentina Darío Conca 2015 2016 Shanghai SIPG
Argentina Emanuel Gigliotti 2015 2016 Chongqing Lifan
Argentina Ezequiel Lavezzi Star 2016 2019 Hebei China Fortune Best known for his two hugely successful stints with Napoli and PSG, he only played 10 games in his debut season owing to injuries and failed to score a goal. However, in the following two seasons, he scored 30 goals in 47 games.
Argentina Javier Mascherano Star 2018 2019 Hebei China Fortune The former captain of Argentina from 2008 to 2011, Mascherano was with Barcelona for 7 years. A defensive midfielder, he scored one goal at Barcelona and equalled that goal tally at Hebei China Fortune.
Argentina Augusto Fernández 2018 2019 Beijing Renhe
Australia Matt McKay 2009 2009 Changchun Yatai
Australia Mark Milligan 2009 2009 Shanghai Shenhua
Australia Mark Bridge 2009 2009 Tianjin Teda
Australia Brendon Šantalab 2009 2009 Chengdu Blades
Australia Chris Coyne 2010 2010 Liaoning Whowin
Australia Jonas Salley 2011 2011 Chengdu Blades
Australia Brendon Šantalab 2011 2011 Chengdu Blades
Australia Adam Kwasnik 2011 2011 Chengdu Blades
Australia Alex Wilkinson 2011 2011 Jiangsu Suning
Australia Bruce Djite 2011 2011 Jiangsu Suning
Australia Dean Heffernan 2011 2011 Liaoning Whowin
Australia Joel Griffiths 2012 2012 Shanghai Shenhua
Australia Jonas Salley 2012 2012 Shanghai Shenxin
Australia Mile Sterjovski 2012 2012 Dalian Yifang
Australia Milan Susak 2012 2012 Tianjin Teda
Australia Joel Griffiths 2013 2013 Qingdao Jonoon
Australia Matt McKay 2013 2013 Changchun Yatai
Australia Michael Marrone 2013 2013 Shanghai Shenxin
Australia Erik Paartalu 2013 2013 Tianjin Teda
Australia Bernie Ibini-Isei 2013 2013 Shanghai SIPG
Australia Eddy Bosnar 2013 2013 Guangzhou RF
Australia Adam Hughes 2014 2014 Harbin Yiteng
Australia Billy Celeski 2014 2014 Liaoning Whowin
Australia Tim Cahill 2015 2015 Shanghai Shenhua
Australia Adrian Leijer 2015 2015 Chongqing Lifan
Australia Ryan McGowan 2016 2016 Henan Jianye
Australia Tim Cahill 2016 2016 Hangzhou Greentown
Australia Michael Thwaite 2016 2016 Liaoning Whowin
Australia James Troisi 2016 2016 Liaoning Whowin
Australia Aleksandar Jovanović 2016 2016 Tianjin Teda
Australia Dario Vidošić 2016 2016 Liaoning Whowin
Australia Ryan McGowan 2017 2017 Guizhou HFZC
Australia James Holland 2017 2017 Liaoning Whowin
Australia Robbie Kruse 2017 2017 Liaoning Whowin
Australia Ryan Griffiths 2007 2008 Liaoning Whowin
Australia Ryan Griffiths 2009 2010 Beijing Guoan
Australia Jonas Salley 2009 2010 Shaanxi Chanba
Australia Joel Griffiths 2009 2011 Beijing Guoan
Australia Adam Griffiths 2010 2011 Hangzhou Greentown
Australia Dino Djulbic 2011 2012 Guizhou HFZC
Australia Rostyn Griffiths 2012 2013 Guangzhou RF
Australia Daniel Mullen 2012 2013 Dalian Yifang
Australia Jonas Salley 2013 2014 Guizhou HFZC
Australia Ryan McGowan 2013 2014 Shandong Luneng
Australia Daniel McBreen 2013 2014 Shanghai SIPG
Australia Josh Mitchell 2014 2015 Liaoning Whowin
Australia Matthew Spiranovic 2015 2016 Hangzhou Greentown
Australia Trent Sainsbury 2016 2017 Jiangsu Suning
Australia Apostolos Giannou 2016 2017 Guangzhou RF
Belgium Kevin Oris 2014 2014 Liaoning Whowin
Belgium Mousa Dembélé 2019 2019 Guangzhou RF
Belgium Marouane Fellaini 2019 2019 Shandong Luneng
Belgium Axel Witsel 2017 2018 Tianjin Tianhai
Belgium Yannick Carrasco Star 2018 2019 Dalian Yifang Only 24 when he moved from Atletico Madrid to CSL newcomers Dalian Yifang, a club owned by Atletico's partial owner Wanda Group, he was part of the Belgian squad for the 2018 FIFA World Cup
Brazil Hugo Henrique 2004 2004 Chongqing Lifan
Brazil Ozeias Fernando Graciano 2004 2004 Shenzhen FC
Brazil Vicente de Paula Neto 2005 2005 Wuhan Guanggu
Brazil Anderson Martins Pedro 2005 2005 Wuhan Guanggu
Brazil Rafael Pereira Pinto 2005 2005 Wuhan Guanggu
Brazil Fabiano Cezar Viegas 2006 2006 Qingdao Jonoon
Brazil Tiago Honorio 2006 2006 Shanghai United
Brazil Aderaldo Ferreira André 2006 2006 Shanghai United
Brazil Jonas Ciciliato Massaranduba 2006 2006 Shanghai United
Brazil Renato Ribas 2006 2006 Shanghai United
Brazil José Ilson dos Santos 2006 2006 Shenyang Ginde
Brazil Alex Alves 2006 2006 Shenyang Ginde
Brazil Aurélio 2006 2006 Tianjin Teda
Brazil Rafael Jaques 2006 2006 Wuhan Guanggu
Brazil Carlos Eduardo 2006 2006 Wuhan Guanggu
Brazil Vicente de Paula Neto 2006 2006 Xi'an Chanba
Brazil Aderaldo Ferreira André 2007 2007 Beijing Guoan
Brazil Alysson Marendaz Marins 2007 2007 Beijing Guoan
Brazil Sergio Júnior 2007 2007 Shaanxi Chanba
Brazil Milson Ferreira dos Santos 2007 2007 Shenzhen FC
Brazil Taila de Souza Charles 2007 2007 Tianjin Teda
Brazil Márcio Santos 2007 2007 Tianjin Teda
Brazil Vicente de Paula Neto 2007 2007 Wuhan Guanggu
Brazil Bruno Lança Andrade 2007 2007 Wuhan Guanggu
Brazil Roberto Aleixo 2007 2007 Wuhan Guanggu
Brazil Argélico Fucks 2007 2007 Zhejiang Greentown
Brazil Eduardo Marques 2007 2007 Zhejiang Greentown
Brazil Wagner da Silva Santos 2007 2007 Zhejiang Greentown
Brazil Marcelo Rosa da Silva 2007 2007 Zhejiang Greentown
Brazil Alex Chandre de Oliveira 2007 2007 Zhejiang Greentown
Brazil Tales Rejane Cabeceira 2008 2008 Changsha Ginde
Brazil Denílson Souza 2008 2008 Chengdu Blades
Brazil José Filho Duarte 2008 2008 Guangzhou Evergrande
Brazil Gílsinho 2008 2008 Henan Jianye
Brazil Douglas Roberto dos Santos 2008 2008 Henan Jianye
Brazil Jefferson Feijão 2008 2008 Liaoning Whowin
Brazil José Roberto Lucini 2008 2008 Liaoning Whowin
Brazil Luciano Ratinho 2008 2008 Shandong Luneng
Brazil Edson Ferreira da Silva 2008 2008 Shenzhen FC
Brazil Felipe Arruda Menegon 2008 2008 Shenzhen FC
Brazil Jonhes Elias Pinto Dos Santos 2008 2008 Tianjin Teda
Brazil Danilo Moreira Serrano 2008 2008 Wuhan Guanggu
Brazil Gustavo Saibt Martins 2008 2008 Wuhan Guanggu
Brazil Emerson Roberto Conceicao Aleixo 2008 2008 Wuhan Guanggu
Brazil Jefferson Feijão 2009 2009 Changsha Ginde
Brazil Agnaldo Novaes dos Santos 2009 2009 Chengdu Blades
Brazil Aílton Gonçalves da Silva 2009 2009 Chongqing Lifan
Brazil Diogo de Lima Barcelos 2009 2009 Guangzhou Evergrande
Brazil André Francisco Williams Rocha da Silva 2009 2009 Hangzhou Greentown
Brazil Carlos Mario Ceballos Agualimpia 2009 2009 Jiangsu Suning
Brazil Rodolfo Kumbrevicius Andorno de Oliveira 2009 2009 Jiangsu Suning
Brazil Estevao Alvarenga Toniato 2009 2009 Shaanxi Chanba
Brazil Sandro Cardoso dos Santos 2009 2009 Shandong Luneng
Brazil Adonis Soares Pavani 2009 2009 Shenzhen FC
Brazil Renan Augustinho Marques 2009 2009 Shenzhen FC
Brazil Valdo 2010 2010 Beijing Guoan
Brazil Sandro Cardoso dos Santos 2010 2010 Changsha Ginde
Brazil Márcio Senna 2010 2010 Dalian Shide
Brazil Éber Luís Cucchi 2010 2010 Jiangsu Suning
Brazil Pedro Henrique Martins 2010 2010 Jiangsu Suning
Brazil Andrezinho 2010 2010 Liaoning Whowin
Brazil Felipe de Oliveira Conceição 2010 2010 Liaoning Whowin
Brazil Gilcimar 2010 2010 Liaoning Whowin
Brazil Beto 2010 2010 Nanchang Hengyuan
Brazil Francisco Alex Moraes 2010 2010 Nanchang Hengyuan
Brazil Alexsandro da Silva 2010 2010 Nanchang Hengyuan
Brazil Célio Ferreira dos Santos 2010 2010 Shaanxi Chanba
Brazil Carlos Santos 2010 2010 Shandong Luneng
Brazil Vicente de Paula Neto 2010 2010 Shanghai Shenhua
Brazil Aderaldo Ferreira André 2010 2010 Shanghai Shenhua
Brazil Tiago Honorio 2010 2010 Shenzhen FC
Brazil Davi 2011 2011 Beijing Guoan
Brazil Roberto Calmon Félix 2011 2011 Beijing Guoan
Brazil Dori 2011 2011 Changchun Yatai
Brazil Renato Cajá 2011 2011 Guangzhou Evergrande
Brazil Fabão 2011 2011 Henan Jianye
Brazil Thiago Potiguar 2011 2011 Henan Jianye
Brazil Rômulo 2011 2011 Henan Jianye
Brazil Valdo 2011 2011 Liaoning Whowin
Brazil di Carmo 2011 2011 Nanchang Hengyuan
Brazil Camilo 2011 2011 Nanchang Hengyuan
Brazil Paulo Roberto 2011 2011 Nanchang Hengyuan
Brazil Éber Luís Cucchi 2011 2011 Qingdao Jonoon
Brazil Wilson 2011 2011 Shaanxi Chanba
Brazil Renato Silva 2011 2011 Shandong Luneng
Brazil Reinaldo 2012 2012 Beijing Guoan
Brazil Cássio 2012 2012 Changchun Yatai
Brazil Weldon 2012 2012 Changchun Yatai
Brazil Leonardo Gonçalves Silva 2012 2012 Guangzhou RF
Brazil Fabrício 2012 2012 Hangzhou Greentown
Brazil Renatinho 2012 2012 Hangzhou Greentown
Brazil Adaílton 2012 2012 Henan Jianye
Brazil Moisés 2012 2012 Shanghai Shenhua
Brazil Anselmo 2012 2012 Shanghai Shenxin
Brazil André Lima 2013 2013 Beijing Guoan
Brazil Éder Baiano 2013 2013 Changchun Yatai
Brazil Zé Carlos 2013 2013 Changchun Yatai
Brazil Isac 2013 2013 Changchun Yatai
Brazil Edu 2013 2013 Liaoning Whowin
Brazil Gustavo 2013 2013 Qingdao Jonoon
Brazil Dinélson 2013 2013 Tianjin Teda
Brazil Santos 2013 2013 Wuhan Zall
Brazil Rafael Coelho 2014 2014 Changchun Yatai
Brazil Bruno Meneghel 2014 2014 Dalian Yifang
Brazil Gilberto Macena 2014 2014 Hangzhou Greentown
Brazil Dori 2014 2014 Harbin Yiteng
Brazil Rodrigo Paixão Mesquita 2014 2014 Harbin Yiteng
Brazil Rafael Marques Mariano 2014 2014 Henan Jianye
Brazil Elias 2014 2014 Jiangsu Suning
Brazil Paulo André 2014 2014 Shanghai Shenhua
Brazil Guto 2015 2015 Chongqing Lifan
Brazil Jajá 2015 2015 Chongqing Lifan
Brazil Robinho 2015 2015 Guangzhou Evergrande
Brazil Ricardo Santos 2015 2015 Guizhou HFZC
Brazil Paulo Henrique 2015 2015 Liaoning Whowin
Brazil Davi Rodrigues de Jesus 2015 2015 Shanghai SIPG
Brazil Zé Eduardo 2015 2015 Shanghai Shenxin
Brazil Rodrigo Defendi 2015 2015 Shijiazhuang Ever Bright
Brazil Lucas Fonseca 2015 2015 Tianjin Teda
Brazil Bruninho 2016 2016 Guangzhou RF
Brazil Denílson Gabionetta 2016 2016 Hangzhou Greentown
Brazil 2016 2016 Jiangsu Suning
Brazil Diego Maurício 2016 2016 Shijiazhuang Ever Bright
Brazil Matheus 2016 2016 Shijiazhuang Ever Bright
Brazil Ivo 2017 2017 Beijing Renhe
Brazil Hyuri 2017 2017 Chongqing Lifan
Brazil Muriqui 2017 2017 Guangzhou Evergrande
Brazil Geuvânio 2017 2017 Tianjin Tianhai
Brazil Júnior Moraes 2017 2017 Tianjin Tianhai
Brazil Sebá 2018 2018 Chongqing Lifan
Brazil Ivo 2018 2018 Henan Jianye
Brazil Marcão 2019 2019 Hebei China Fortune
Brazil Henrique Dourado 2019 2019 Henan Jianye
Brazil Alan Carvalho 2019 2019 Tianjin Tianhai
Brazil Renatinho 2019 2019 Tianjin Tianhai
Brazil Rafael Silva 2019 2019 Wuhan Zall
Brazil Léo Baptistão 2019 2019 Wuhan Zall
Brazil Adilson dos Santos 2004 2005 Dalian Shide
Brazil Zé Alcino 2004 2005 Inter Shanghai
Brazil Gílsinho 2005 2007 Wuhan Guanggu
Brazil Tiago Honorio 2007 2008 Beijing Guoan
Brazil Sandro Cardoso dos Santos 2007 2008 Changsha Ginde
Brazil Rafael Scheidt 2007 2008 Shaanxi Chanba
Brazil Ronny Carlos da Silva 2007 2009 Shaanxi Chanba
Brazil Auricelio Neres Rodrigues 2008 2009 Chengdu Blades
Brazil Diego de Lima Barcelos 2008 2009 Guangzhou Evergrande
Brazil Vicente de Paula Neto 2008 2009 Shaanxi Chanba
Brazil Éber Luís Cucchi 2008 2009 Tianjin Teda
Brazil Valdo 2008 2009 Zhejiang Greentown
Brazil José Filho Duarte 2009 2010 Chongqing Lifan
Brazil Geninho 2009 2010 Jiangsu Suning
Brazil Netto 2009 2012 Henan Jianye
Brazil Eleílson Farias de Moura 2009 2015 Jiangsu Suning
Brazil Nei 2010 2011 Changchun Yatai
Brazil Johnny Osório 2010 2015 Shanghai Shenxin
Brazil Adriano 2011 2012 Dalian Shide
Brazil Cléo 2011 2012 Guangzhou Evergrande
Brazil Paulão 2011 2012 Guangzhou Evergrande
Brazil Léo San 2011 2012 Qingdao Jonoon
Brazil Obina 2011 2012 Shandong Luneng
Brazil Fabiano 2011 2012 Shandong Luneng
Brazil Muriqui 2011 2014 Guangzhou Evergrande
Brazil Fábio Rochemback 2012 2013 Dalian Yifang
Brazil Jumar José da Costa Júnior 2012 2013 Guangzhou RF
Brazil Rafael Coelho 2012 2013 Guangzhou RF
Brazil Mazola 2012 2013 Hangzhou Greentown
Brazil Bruno Meneghel 2012 2013 Qingdao Jonoon
Brazil Gilberto Macena 2012 2013 Shandong Luneng
Brazil Antônio Flávio 2012 2013 Shanghai Shenxin
Brazil Davi Rodrigues de Jesus 2012 2014 Guangzhou RF
Brazil Jaílton Paraíba 2012 2014 Shanghai Shenxin
Brazil Eninho 2013 2014 Changchun Yatai
Brazil Vágner Love 2013 2014 Shandong Luneng
Brazil Kieza 2013 2014 Shanghai Shenxin
Brazil Éder Lima 2013 2014 Tianjin Teda
Brazil Baré 2013 2014 Tianjin Teda
Brazil Elkeson 2013 2015 Guangzhou Evergrande
Brazil Andrezinho 2013 2015 Tianjin Teda
Brazil Renê Júnior 2014 2015 Guangzhou Evergrande
Brazil Hyuri 2014 2015 Guizhou HFZC
Brazil Junior Urso 2014 2015 Shandong Luneng
Brazil Paulo Henrique 2014 2015 Shanghai Shenhua
Brazil Everton 2014 2015 Shanghai Shenxin
Brazil Anselmo Ramon 2014 2016 Hangzhou Greentown
Brazil Aloísio 2014 2016 Shandong Luneng
Brazil Ivo 2015 2016 Henan Jianye
Brazil Kléber 2015 2016 Beijing Guoan
Brazil Jael Ferreira 2015 2016 Chongqing Lifan
Brazil Jucilei 2015 2016 Shandong Luneng
Brazil Wágner 2015 2016 Tianjin Teda
Brazil Ricardo Goulart 2015 2018 Guangzhou Evergrande
Brazil Alan Carvalho 2015 2018 Guangzhou Evergrande
Brazil Renatinho 2015 2018 Guangzhou RF
Brazil Diego Tardelli 2015 2018 Shandong Luneng
Brazil Fernandinho Henrique 2015 2019 Chongqing Lifan
Brazil Paulinho Star 2015 2019 Guangzhou Evergrande Paulinho moved to China in 2015 after two forgettable seasons with Tottenham Hotspur. He was a huge hit in the CSL and his form for Guangzhou Evergrande earned him a recall to the Brazil national team. In 2017, Paulinho made a shock return to Europe with Barcelona and played a key role in helping the club win the La Liga. A year later, he returned to Guangzhou Evergrande and in 13 games, he has already scored 10 times.
Brazil Ralf 2016 2017 Beijing Guoan
Brazil Bruno Meneghel 2016 2017 Changchun Yatai
Brazil Aloísio 2016 2017 Hebei China Fortune
Brazil Renato Augusto 2016 2019 Beijing Guoan
Brazil Alan Kardec 2016 2019 Chongqing Lifan
Brazil Ramires Star 2016 2019 Jiangsu Suning Ramires spent 5.5 seasons with Chelsea. He also won the honour of becoming Chelsea Players’ Player of the Year in 2011/12. During the 2018 European summer transfer window, he attempted to force a move back to Benfica but the deal collapsed. The result of his actions was his banishment to the club’s reserves.
Brazil Alex Teixeira 2016 2019 Jiangsu Suning
Brazil Gil 2016 2019 Shandong Luneng
Brazil Elkeson 2016 2019 Shanghai SIPG
Brazil Hulk Star 2016 2019 Shanghai SIPG Before moving to China, he played for three years in Japan, then 4 years in Russia. He has been a huge hit in China, scoring 46 times in 82 games and was named in the Chinese Super League Team of the Year in 2017.
Brazil Hernanes 2017 2018 Hebei China Fortune
Brazil Marinho 2017 2018 Changchun Yatai
Brazil Junior Urso 2017 2018 Guangzhou RF
Brazil Alexandre Pato Star 2017 2018 Tianjin Tianhai
Brazil Oscar Star 2017 2019 Shanghai SIPG Of all the players who moved to China in recent years, the most shocking transfer has to be that of Oscar. He was 25-years-old when he moved to Shanghai SIPG and there were offers on the table from Atletico Madrid and Serie A clubs.
Brazil Luiz Fernandinho 2018 2019 Chongqing Lifan
Brazil Talisca 2018 2019 Guangzhou Evergrande
Brazil Fernando Karanga 2018 2019 Henan Jianye
Brazil Róger Guedes 2018 2019 Shandong Luneng
Brazil Johnathan 2018 2019 Tianjin Teda
Colombia Carlos Ceballos 2009 2009 Jiangsu Suning
Colombia Leiner Gomez Viafara 2009 2009 Jiangsu Suning
Colombia Juan Camilo Angulo 2011 2011 Shanghai Shenhua
Colombia Yovanny Arrechea 2011 2011 Changchun Yatai
Colombia Javier Andres Estupinan Romero 2011 2011 Chengdu Blades
Colombia Eisner Iván Loboa 2011 2011 Shanghai Shenhua
Colombia John Mosquera 2012 2012 Changchun Yatai
Colombia Edixon Perea 2012 2012 Changchun Yatai
Colombia Luis Carlos Cabezas 2013 2013 Shanghai SIPG
Colombia Ricardo Steer 2014 2014 Harbin Yiteng
Colombia Luis Carlos Ruiz 2014 2014 Shanghai Shenhua
Colombia Edison Toloza 2014 2014 Jiangsu Suning
Colombia Wilmar Jordán 2015 2015 Tianjin Teda
Colombia Jackson Martínez 2016 2016 Guangzhou Evergrande
Colombia Fredy Montero 2016 2016 Tianjin Teda
Colombia Duvier Riascos 2018 2018 Dalian Yifang
Colombia Harold Preciado 2019 2019 Shenzhen FC
Colombia Hamilton Ricard 2007 2008 Shanghai Shenhua
Colombia Ricardo Steer 2009 2010 Changchun Yatai
Colombia Duvier Riascos 2010 2011 Shanghai Shenhua
Colombia Giovanni Moreno 2012 2019 Shanghai Shenhua
Colombia Carmelo Valencia 2013 2014 Tianjin Teda
Colombia Roger Martínez 2016 2017 Jiangsu Suning
Colombia Fredy Guarín 2016 2019 Shanghai Shenhua
Costa Rica Erick Scott 2008 2008 Shanghai Shenhua
Costa Rica Johnny Woodly Lambert 2009 2009 Chongqing Lifan
Costa Rica Johnny Woodly Lambert 2010 2010 Changchun Yatai
Costa Rica Johnny Woodly Lambert 2010 2010 Chongqing Lifan
Costa Rica Rodolfo Rodríguez 2010 2010 Tianjin Teda
Costa Rica Porfirio López Meza 2010 2010 Dalian Shide
Costa Rica José Luis López 2010 2010 Dalian Shide
Costa Rica Michael Barrantes 2015 2015 Shanghai Shenxin
Croatia Josip Bulat 2004 2004 Qingdao Jonoon
Croatia Ivan Bulat 2004 2004 Chongqing Lifan
Croatia Velibor Kopunović 2006 2006 Chongqing Lifan
Croatia Velibor Kopunović 2006 2006 Qingdao Jonoon
Croatia Darko Čordaš 2006 2006 Chongqing Lifan
Croatia Jurica Vučko 2007 2007 Tianjin Teda
Croatia Igor Budiša 2007 2007 Qingdao Jonoon
Croatia Igor Tkalčević 2008 2008 Chengdu Blades
Croatia Vedran Celiščak 2008 2008 Dalian Shide
Croatia Stjepan Jukić 2010 2010 Qingdao Jonoon
Croatia Frane Čačić 2010 2010 Changsha Ginde
Croatia Bruno Šiklić 2010 2010 Chongqing Lifan
Croatia Ivan Brečević 2010 2010 Shaanxi Chanba
Croatia Krunoslav Lovrek 2012 2012 Qingdao Jonoon
Croatia Leon Benko 2014 2014 Dalian Yifang
Croatia Darko Matić 2016 2016 Changchun Yatai
Croatia Sammir 2016 2016 Hangzhou Greentown
Croatia Mislav Oršić 2016 2016 Changchun Yatai
Croatia Ivan Bulat 2005 2007 Inter Shanghai
Croatia Darko Matić 2007 2008 Tianjin Teda
Croatia Darko Matić 2009 2015 Beijing Guoan
Croatia Sammir 2015 2016 Jiangsu Suning
Croatia Goran Milović 2016 2017 Chongqing Lifan
Croatia Nikica Jelavić 2017 2018 Guizhou HFZC
France Nicolas Ouédec 2004 2004 Shandong Luneng
France Jean-Philippe Caillet 2009 2009 Tianjin Teda
France Cédric Sabin 2010 2010 Shaanxi Chanba
France Michaël Murcy 2010 2010 Shandong Luneng
France Nicolas Anelka 2012 2012 Shanghai Shenhua
France Mathieu Manset 2012 2012 Shanghai Shenhua
France Guillaume Hoarau 2013 2013 Dalian Yifang
France Julien Gorius 2016 2016 Changchun Yatai
France Jean-Philippe Mendy 2016 2016 Shijiazhuang Ever Bright
France Anthony Modeste 2017 2018 Tianjin Tianhai
Germany Jörg Albertz 2004 2004 Shanghai Shenhua
Germany Carsten Jancker 2006 2006 Shanghai Shenhua
Germany Mike Hanke 2014 2014 Guizhou HFZC
Germany Sandro Wagner 2019 2019 Tianjin Teda
Germany Felix Bastians 2018 2019 Tianjin Teda
Iceland Viðar Kjartansson 2015 2015 Jiangsu Suning
Iceland Sölvi Ottesen 2015 2015 Jiangsu Suning
Iceland Eiður Guðjohnsen 2015 2015 Shijiazhuang Ever Bright
Iceland Sölvi Ottesen 2017 2017 Guangzhou RF
Japan Takashi Rakuyama 2011 2011 Shenzhen FC
Japan Seiichiro Maki 2011 2011 Shenzhen FC
Japan Masashi Oguro 2013 2013 Hangzhou Greentown
Japan Sergio Escudero 2015 2015 Jiangsu Suning
Morocco Nabil Baha 2013 2013 Dalian Yifang
Morocco Issam El Adoua 2015 2015 Chongqing Lifan
Morocco Abderrazak Hamdallah 2014 2015 Guangzhou RF
Morocco Ayoub El Kaabi 2018 2019 Hebei China Fortune
Nigeria Samuel Ayorinde 2004 2004 Shenyang Ginde
Nigeria Prince Ikpe Ekong 2004 2004 Shenyang Ginde
Nigeria Benedict Akwuegbu 2006 2006 Tianjin Teda
Nigeria Henry Makinwa 2006 2006 Tianjin Teda
Nigeria Deniran Ortega 2006 2006 Chongqing Lifan
Nigeria Benedict Akwuegbu 2007 2007 Qingdao Jonoon
Nigeria Garba Lawal 2007 2007 Changsha Ginde
Nigeria Edison Joseph 2009 2009 Shaanxi Chanba
Nigeria Pascal Kondaponi 2009 2009 Qingdao Jonoon
Nigeria Ernest Jeremiah Chukwuma 2009 2009 Hangzhou Greentown
Nigeria Alfred Emuejeraye 2010 2010 Tianjin Teda
Nigeria Akanni-Sunday Wasiu 2010 2010 Changsha Ginde
Nigeria Victor Agali 2010 2010 Jiangsu Suning
Nigeria Obiora Odita 2011 2011 Tianjin Teda
Nigeria Bentley 2013 2013 Wuhan Zall
Nigeria Peter Utaka 2014 2014 Shanghai Shenxin
Nigeria Daniel Chima 2015 2015 Shanghai Shenxin
Nigeria Brown Ideye 2017 2017 Tianjin Teda
Nigeria Odion Ighalo 2019 2019 Shanghai Shenhua
Nigeria Sone Aluko 2019 2019 Beijing Renhe
Nigeria Admas Kola 2004 2005 Inter Shanghai
Nigeria Gabriel Melkam 2006 2007 Xiamen Lanshi
Nigeria Gabriel Melkam 2008 2009 Changchun Yatai
Nigeria Obi Moneke 2008 2010 Henan Jianye
Nigeria Gabriel Melkam 2011 2013 Qingdao Jonoon
Nigeria Peter Utaka 2012 2013 Dalian Yifang
Nigeria Yakubu 2012 2013 Guangzhou RF
Nigeria Peter Utaka 2013 2014 Beijing Guoan
Nigeria Aaron Samuel Olanare 2014 2015 Guangzhou RF
Nigeria Derick Ogbu 2014 2015 Liaoning Whowin
Nigeria Anthony Ujah 2016 2017 Liaoning Whowin
Nigeria Obafemi Martins 2016 2018 Shanghai Shenhua
Nigeria John Obi Mikel Star 2017 2018 Tianjin Teda Mikel played 374 games for Chelsea in ten and a half seasons winning nine trophies. He represented Nigeria at the 2018 FIFA World Cup
Nigeria Odion Ighalo 2017 2018 Changchun Yatai
Poland Mateusz Zachara 2015 2015 Henan Jianye
Poland Adrian Mierzejewski 2018 2018 Changchun Yatai
Poland Adrian Mierzejewski 2019 2019 Chongqing Lifan
Poland Marek Zając 2004 2008 Shenzhen FC
Poland Bogdan Zając 2006 2007 Shenzhen FC
Poland Emmanuel Olisadebe 2008 2010 Henan Jianye
Poland Krzysztof Mączyński 2014 2015 Guizhou HFZC
Portugal Joaquim Ferraz 2004 2004 Qingdao Jonoon
Portugal Hugo Carreira 2009 2009 Qingdao Jonoon
Portugal Manú 2012 2012 Beijing Guoan
Portugal Ricardo Esteves 2012 2012 Dalian Shide
Portugal Ricardo Carvalho 2017 2017 Shanghai SIPG
Portugal José Fonte 2018 2018 Dalian Yifang
Portugal Orlando Sá 2018 2018 Henan Jianye
Portugal Rúben Micael 2015 2016 Shijiazhuang Ever Bright
Portugal Ricardo Vaz Tê 2017 2018 Henan Jianye
Senegal Mouchid Iyane Ly 2009 2009 Shenzhen FC
Senegal Amado Diallo 2010 2010 Henan Jianye
Senegal Ladji Keita 2011 2011 Beijing Guoan
Senegal Jacques Faty 2013 2013 Wuhan Zall
Senegal Ibrahima Touré 2016 2016 Liaoning Whowin
Senegal Demba Ba 2018 2018 Shanghai Shenhua
Senegal Cheikh M'Bengue 2019 2019 Shenzhen FC
Senegal Adama François Sene 2011 2012 Beijing Guoan
Senegal Demba Ba 2015 2016 Shanghai Shenhua
Senegal Mbaye Diagne 2016 2017 Tianjin Teda
Senegal Papiss Cissé 2016 2018 Shandong Luneng
Senegal Makhete Diop 2018 2019 Beijing Renhe
Serbia Miodrag Pantelić 2004 2004 Sichuan Guancheng
Serbia Vladimir Matijašević 2004 2004 Shandong Luneng
Serbia Darko Anić 2004 2004 Shandong Luneng
Serbia Branko Savić 2004 2004 Liaoning Whowin
Serbia Branimir Petrović 2005 2005 Shandong Luneng
Serbia Ivan Jovanović 2006 2006 Shanghai Shenhua
Serbia Despot Visković 2006 2006 Qingdao Jonoon
Serbia Saša Zimonjić 2006 2006 Xiamen Lanshi
Serbia Pavle Delibašić 2006 2006 Chongqing Lifan
Serbia Miodrag Pantelić 2007 2007 Beijing Guoan
Serbia Saša Zorić 2007 2007 Changsha Ginde
Serbia Saša Zorić 2007 2007 Xiamen Lanshi
Serbia Nikola Malbaša 2007 2007 Shandong Luneng
Serbia Branko Baković 2007 2007 Shandong Luneng
Serbia Miodrag Anđelković 2007 2007 Dalian Shide
Serbia Darko Drinić 2007 2007 Dalian Shide
Serbia Vidak Bratić 2007 2007 Tianjin Teda
Serbia Milan Nikolić 2008 2008 Changsha Ginde
Serbia Dragan Vukmir 2008 2008 Dalian Shide
Serbia Marko Zorić 2009 2009 Shenzhen FC
Serbia Aleksandar Živković 2010 2010 Shenzhen FC
Serbia Miloš Bajalica 2010 2010 Henan Jianye
Serbia Goran Gavrančić 2010 2010 Henan Jianye
Serbia Siniša Radanović 2010 2010 Shandong Luneng
Serbia Borko Veselinović 2010 2010 Dalian Shide
Serbia Ivan Vukomanović 2010 2010 Qingdao Jonoon
Serbia Dušan Đokić 2010 2010 Chongqing Lifan
Serbia Miloš Mihajlov 2010 2010 Changchun Yatai
Serbia Radomir Koković 2011 2011 Changchun Yatai
Serbia Vladimir Bogdanović 2011 2011 Liaoning Whowin
Serbia Miljan Mrdaković 2012 2012 Jiangsu Suning
Serbia Andrija Kaluđerović 2012 2012 Beijing Guoan
Serbia Marko Ljubinković 2012 2012 Changchun Yatai
Serbia Novak Martinović 2013 2013 Wuhan Zall
Serbia Miloš Stojanović 2013 2013 Wuhan Zall
Serbia Aleksandar Jevtić 2014 2014 Liaoning Whowin
Serbia Miloš Bosančić 2015 2015 Hangzhou Greentown
Serbia Ognjen Ožegović 2016 2016 Changchun Yatai
Serbia Nemanja Gudelj 2017 2017 Tianjin Teda
Serbia Nemanja Gudelj 2018 2018 Guangzhou Evergrande
Serbia Marko Perović 2018 2018 Guangzhou RF
Serbia Nemanja Pejčinović 2018 2018 Changchun Yatai
Serbia Branko Jelić 2004 2005 Beijing Guoan
Serbia Miodrag Pantelić 2005 2006 Dalian Shide
Serbia Marko Zorić 2005 2006 Tianjin Teda
Serbia Branko Jelić 2006 2007 Xiamen Lanshi
Serbia Aleksandar Živković 2006 2009 Shandong Luneng
Serbia Miljan Mrdaković 2008 2009 Shandong Luneng
Serbia Dragan Stančić 2008 2009 Qingdao Jonoon
Serbia Marko Sočanac 2008 2009 Qingdao Jonoon
Serbia Marko Zorić 2010 2011 Tianjin Teda
Serbia Miloš Bajalica 2010 2011 Shaanxi Chanba
Serbia Aleksandar Jevtić 2011 2013 Jiangsu Suning
Serbia Vladimir Jovančić 2012 2013 Tianjin Teda
Serbia Miloš Trifunović 2012 2013 Liaoning Whowin
Serbia Nikola Petković 2016 2017 Yanbian Funde
Serbia Duško Tošić 2018 2019 Guangzhou RF
South Korea Lee Kyung-Soo 2004 2004 Sichuan Guancheng
South Korea Jeon Woo-Keun 2009 2009 Dalian Shide
South Korea Lee Tae-Young 2009 2009 Qingdao Jonoon
South Korea Sim Jae-Won 2009 2009 Changsha Ginde
South Korea Kim Eun-Jung 2009 2009 Changsha Ginde
South Korea Lee Sang-Il 2009 2009 Changsha Ginde
South Korea Lee Se-In 2010 2010 Changchun Yatai
South Korea Park Jae-hong 2010 2010 Jiangsu Suning
South Korea Lee Jon-Ming 2010 2010 Qingdao Jonoon
South Korea Woo Choo-Young 2010 2010 Changsha Ginde
South Korea Cho Se-Kwon 2010 2010 Chongqing Lifan
South Korea Lee Yoon-Sup 2010 2010 Qingdao Jonoon
South Korea Jeon Kwang-Jin 2011 2011 Dalian Shide
South Korea Kim Jin-Kyu 2011 2011 Dalian Shide
South Korea Lee Joon-Yeop 2011 2011 Henan Jianye
South Korea Ko Jae-Sung 2011 2011 Nanchang Hengyuan
South Korea Kwon Jip 2011 2011 Tianjin Teda
South Korea Song Chong-Gug 2011 2011 Tianjin Teda
South Korea Park Dong-Hyuk 2012 2012 Dalian Shide
South Korea Jeong Dong-Ho 2012 2012 Hangzhou Greentown
South Korea Son Seung-Joon 2012 2012 Henan Jianye
South Korea Cho Won-Hee 2013 2013 Wuhan Zall
South Korea Son Dae-Ho 2014 2014 Hangzhou Greentown
South Korea Lee Ji-Nam 2014 2014 Henan Jianye
South Korea Yoon Sin-Young 2014 2014 Jiangsu Suning
South Korea Cho Byung-Kuk 2014 2014 Shanghai Shenhua
South Korea Noh Hyung-Goo 2014 2014 Harbin Yiteng
South Korea Choi Hyun-Yeon 2014 2014 Harbin Yiteng
South Korea Kim Yoo-Jin 2015 2015 Liaoning Whowin
South Korea Park Ju-Sung 2015 2015 Guizhou HFZC
South Korea Jung In-Whan 2015 2015 Henan Jianye
South Korea Ha Tae-Goon 2016 2016 Yanbian Funde
South Korea Oh Beom-Seok 2016 2016 Hangzhou Greentown
South Korea Kim Ju-Young 2017 2017 Hebei China Fortune
South Korea Kim Hyung-il 2017 2017 Guangzhou Evergrande
South Korea Hwang Seok-Ho 2017 2017 Tianjin Teda
South Korea Hwang Il-Su 2017 2017 Yanbian Funde
South Korea Song Tae-Lim 2009 2010 Henan Jianye
South Korea Ahn Jung-Hwan 2009 2011 Dalian Shide
South Korea Cho Won-Hee 2011 2012 Guangzhou Evergrande
South Korea Kim Yoo-Jin 2011 2012 Liaoning Whowin
South Korea Kim Dong-Jin 2012 2013 Hangzhou Greentown
South Korea Kim Young-Gwon 2012 2018 Guangzhou Evergrande
South Korea Ha Dae-Sung 2014 2015 Beijing Guoan
South Korea Park Jong-Woo 2014 2015 Guangzhou RF
South Korea Lim You-Hwan 2014 2015 Shanghai Shenxin
South Korea Jang Hyun-Soo 2014 2017 Guangzhou RF
South Korea Kim Ju-Young 2015 2016 Shanghai SIPG
South Korea Cho Yong-Hyung 2015 2016 Shijiazhuang Ever Bright
South Korea Yoon Bit-Garam 2016 2017 Yanbian Funde
South Korea Kim Seung-Dae 2016 2017 Yanbian Funde
South Korea Jung Woo-Young 2016 2017 Chongqing Lifan
South Korea Kim Kee-Hee 2016 2017 Shanghai Shenhua
South Korea Hong Jeong-Ho 2016 2017 Jiangsu Suning
South Korea Kwon Kyung-Won 2017 2019 Tianjin Tianhai
South Korea Kim Min-jae 2019 2019 Beijing Guoan
South Korea Park Ji-soo 2019 2019 Guangzhou Evergrande
Spain Rubén Suárez 2012 2012 Guizhou HFZC
Spain Miguel Alfonso Herrero 2015 2015 Guangzhou RF
Spain Rubén Castro 2017 2017 Guizhou HFZC
Spain Juan Cala 2018 2018 Henan Jianye
Spain Nano 2012 2013 Guizhou HFZC
Spain Rafa Jordà 2012 2013 Guizhou HFZC
Spain Ibán Cuadrado 2013 2014 Shanghai East Asia
Spain Jonathan Soriano 2017 2018 Beijing Guoan
Spain Mario Suárez 2017 2018 Guizhou HFZC
Spain Jonathan Viera 2018 2019 Beijing Guoan
Sweden Daniel Nannskog 2004 2004 Sichuan Guancheng
Sweden Niklas Backman 2014 2014 Dalian Yifang
Sweden Imad Khalili 2014 2014 Shanghai SIPG
Sweden Magnus Eriksson 2015 2015 Guizhou HFZC
Sweden Gustav Svensson 2016 2016 Guangzhou RF
Sweden Osman Sow 2016 2016 Henan Jianye
Sweden Tobias Hysén 2014 2015 Shanghai SIPG
Tunisia Imed Ben Younes 2007 2007 Henan Jianye
Tunisia Enis Hajri 2012 2012 Henan Jianye
Tunisia Bassem Boulaabi 2015 2015 Hangzhou Greentown
Tunisia Imed Louati 2015 2015 Hangzhou Greentown
Uruguay Peter Vera 2004 2004 Shanghai Shenhua
Uruguay Fernando Correa 2007 2007 Shanghai Shenhua
Uruguay Diego Alonso 2007 2007 Shanghai Shenhua
Uruguay Sergio Blanco 2007 2007 Shanghai Shenhua
Uruguay Juan Manuel Olivera 2007 2007 Shaanxi Chanba
Uruguay Pablo Munhoz 2008 2008 Wuhan Guanggu
Uruguay Edgar Martínez 2009 2009 Chongqing Lifan
Uruguay Matías Masiero 2011 2011 Hangzhou Greentown
Uruguay Paulo Pezzolano 2011 2011 Hangzhou Greentown
Uruguay Sebastián Vázquez 2011 2011 Hangzhou Greentown
Uruguay Jonathan Ramis 2011 2011 Nanchang Hengyuan
Uruguay Diego Vera 2011 2011 Nanchang Hengyuan
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="bboxCollision.js"></script>
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
</style>
</head>
<body>
<div id="chart"></div>
<script>
d3.csv("csl_foreign_players.csv", function(csv) {
var player, circle, path, text_country, text_team, text_player, entered_nodes, simulation1, simulation2
var nodes = [] // array to store ALL nodes
var links = [] // array to store ALL links
var multiplier = (screen.width < 1024 ? 0.75 : 0.95)
var screenWidth = Math.max(document.documentElement.clientHeight, window.innerHeight || 0) * multiplier
var screenHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
var canvasDim = { width: screenWidth, height: screenHeight}
var margin = {top: 20, right: 20, bottom: 20, left: 20}
var width = canvasDim.width - margin.left - margin.right
var height = canvasDim.width - margin.top - margin.bottom
var radius = canvasDim.width * 0.45
var svg = d3.select("#chart").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var pathG = svg.append("g")
.attr("class", "pathG")
var circleG = svg.append("g")
.attr("class", "circleG")
var textG = svg.append("g")
.attr("class", "textG")
var data = csv.map(function(d) {
return {
country: d.Country,
player: d.Player,
club: d.Club_Name_1 + " " + d.Club_Name_2
}
})
// CREATE COUNTRY NODES
var countries = ['Brazil','Portugal', 'Germany', 'Poland', 'France', 'Argentina', 'Spain', 'South Korea', 'Uruguay', 'Colombia', 'Croatia', 'Costa Rica', 'Nigeria', 'Iceland', 'Sweden', 'Australia', 'Senegal', 'Serbia', 'Morocco', 'Tunisia', 'Belgium', 'Japan']
var country_stats = d3.nest()
.key(function(d) { return d.country }).sortKeys(function(a,b) { return countries.indexOf(a) - countries.indexOf(b); }) // custom sort arrangement of country nodes to make force layout aesthetically pleasing
.entries(data);
country_stats.map(function(d,i) {
var radian = (2 * Math.PI) / countries.length * i - (Math.PI / 2);
nodes.push({
id: d.key,
size: 6,
fill: 'black', // standardize empty black circle for each team
stroke: 'black',
type: 'country',
fx: radius * Math.cos(radian) + (width / 2),
fy: radius * Math.sin(radian) + (height / 2)
})
})
// CREATE TEAM NODES
var team_stats = d3.nest()
.key(function(d) { return d.club })
.key(function(d) { return d.country })
.rollup(function(leaves) { return leaves.length })
.entries(data)
team_stats.map(function(d,i) {
nodes.push({
id: d.key,
size: d.values.length*2,
fill: '#F4B95F',
stroke: '#F4B95F',
type: 'team',
x: width/2,
y: height/2
})
})
var countryNodes_nested = d3.nest()
.key(function(d) { return d.id })
.entries(nodes.filter(d=>d.type=='country'))
var team_stats1 = d3.nest()
.key(function(d) { return d.country })
.entries(data)
var linkStrengths = [] // create custom link strength scale based on number of players from each country
team_stats1.map(function(d,i) {
linkStrengths.push(d.values.length)
})
var strengthScale = d3.scaleLinear()
.domain([d3.min(linkStrengths), d3.max(linkStrengths)])
.range([0, 1])
team_stats1.map(function(d,i) {
var radian = (2 * Math.PI) / countries.length * i - (Math.PI / 2);
d.values.map(x => {
// CREATE A NODE FOR EACH PLAYER
var node = {
text: x.player,
id: x.player.replace(/[^A-Z0-9]+/ig, "_") + "/" + x.club.replace(/[^A-Z0-9]+/ig, "_"),
size: 2,
fill: 'grey',
stroke: 'none',
type: 'player',
x: radius-40 * Math.cos(radian) + (width / 2),
y: radius-40 * Math.sin(radian) + (height / 2)
}
nodes.push(node)
// CREATE COUNTRY-PLAYER LINKS
links.push({
source: countryNodes_nested.find(n=>n.key == x.country).values[0],
target: node,
size: 0.5,
strength: 0.5,
stroke: 'lightgrey',
type: 'country_player',
// remove spaces because they cannot be contained in class/id names
id: x.country.replace(/[^A-Z0-9]+/ig, "_") + "/" + x.player.replace(/[^A-Z0-9]+/ig, "_") + x.club.replace(/[^A-Z0-9]+/ig, "_")
})
// CREATE PLAYER-TEAM LINKS
links.push({
source: node,
target: nodes.filter(d=>d.type=='team').find(n=>n.id == x.club),
size: 0.5,
strength: strengthScale(d.values.length),
stroke: '#F4B95F',
type: 'player_team',
id: x.player.replace(/[^A-Z0-9]+/ig, "_") + "/" + x.club.replace(/[^A-Z0-9]+/ig, "_")
})
})
})
// Initialize force simulation
simulation1 = d3.forceSimulation()
.force("link", d3.forceLink()
.id(function(d) { return d.id; })
.strength(function(d) {return d.strength})
.distance(40)
)
.force("collide", d3.forceCollide().radius(function(d) { return d.size * 1.3 }))
simulation1
.nodes(nodes)
.on("tick", update) // start simulation to update node positions
simulation1.force("link")
.links(links)
simulation1.stop()
for (var i = 0; i < 100; ++i) simulation1.tick()
simulation1.alpha(1).alphaDecay(0.1).restart()
enter() // create DOM elements
function enter() {
path = pathG.selectAll('line')
.data(links).enter().append('line')
.attr('stroke-linecap', 'round')
circle = circleG.selectAll('circle')
.data(nodes)
.enter().append('circle')
.attr('stroke-width', 2)
text_country = textG.selectAll('.text_country')
.data(nodes.filter(d=>d.type=='country'))
.enter().append('text')
.attr('class', 'text_country')
.attr('text-anchor', 'middle')
.attr('dy', '.35em')
.attr('fill', '#555')
.style('font-size', '12px')
.style('font-family', 'Helvetica')
.style('font-weight', 'bold')
.style('pointer-events', 'none')
text_team = textG.selectAll('text_team')
.data(nodes.filter(d=>(d.type=='team') & (d.size>10)))
.enter().append('text')
.attr('class', 'text_team')
.attr('text-anchor', 'middle')
.attr('dy', '.35em')
.attr('fill', '#555')
.style('font-size', '12px')
.style('font-weight', 'normal')
.style('pointer-events', 'none')
text1 = text_team.append('tspan')
text2 = text_team.append('tspan')
}
function update() {
path.attr('stroke-width', function(d) {return d.size})
.attr('stroke', function(d) {return d.stroke})
.attr('fill', function(d) {return d.stroke})
.attr('x1', function(d) {return d.source.x})
.attr('y1', function(d) {return d.source.y})
.attr('x2', function(d) {return d.target.x})
.attr('y2', function(d) {return d.target.y})
.attr('class', function(d) {return d.type})
.attr('id', function(d) {return d.id})
circle.attr('r', function(d) {return d.size})
.attr('stroke', function(d) {return d.stroke || 'none'})
.attr('fill', function(d) {return d.fill || '#fff'})
.attr('cx', function(d) {return d.x})
.attr('cy', function(d) {return d.y})
.attr('class', function(d) {return d.type})
.attr('id', function(d) {return d.id})
text_country.attr('x', function(d) {return d.x})
.attr('y', function(d) {return d.y + 15})
.attr('id', function(d) {return d.id})
.text(function(d) {return d.id})
text1.attr('x', function(d) {return d.x})
.attr('y', function(d) {return d.y-8})
.attr('id', function(d) {return d.id.replace(/[^A-Z0-9]+/ig, "_")})
.text(function(d) {return d.id.split(' ')[0]})
text2.attr('x', function(d) {return d.x})
.attr('y', function(d) {return d.y+8})
.attr('id', function(d) {return d.id.replace(/[^A-Z0-9]+/ig, "_")})
.text(function(d) {return d.id.split(' ')[1]})
interactive()
}
function updatePlayerText() {
text_player.attr('x', function(d) {return d.x})
.attr('y', function(d) {return d.y})
.attr('id', function(d) {return d.id})
.text(function(d) {return d.text})
.style('opacity', 1)
selCircles.attr('cx', function(d) {return d.x})
.attr('cy', function(d) {return d.y})
selLines.attr('x1', function(d) {return d.source.x})
.attr('y1', function(d) {return d.source.y})
.attr('x2', function(d) {return d.target.x})
.attr('y2', function(d) {return d.target.y})
}
function interactive() {
d3.selectAll('.team').on('mouseover', function (l) {
d3.select(this).style("cursor", "pointer")
d3.selectAll(".country_player").style('opacity', 0) // make all country-player links invisible
d3.selectAll(".player_team").style('opacity', 0) // make all player-team links invisible
d3.selectAll('.team').style('opacity', 0) // make all team nodes invisible
d3.selectAll('.player').style('opacity', 0) // make all player nodes invisible
text1.style('opacity', 0) // make all team node labels invisible
text2.style('opacity', 0) // make all team node labels invisible
var players = nodes.filter(d=>d.id.includes(l.id.replace(/[^A-Z0-9]+/ig, "_"))===true)
text_player = textG.selectAll('.text_player').data(players)
selCircles = d3.selectAll("circle[id*='" + l.id.replace(/[^A-Z0-9]+/ig, "_") + "']")
selLines = d3.selectAll("line[id*='" + l.id.replace(/[^A-Z0-9]+/ig, "_") + "']")
simulation2 = d3.forceSimulation()
.force("collide", bboxCollision([[-4,-8],[4,8]]))
.on("tick", updatePlayerText)
entered_nodes = text_player.enter().append('text')
.attr('class', 'text_player')
.attr('text-anchor', 'middle')
.attr('dy', '.35em')
.attr('fill', '#555')
.style('font-size', '10px')
.style('font-weight', 'normal')
simulation1.stop()
simulation2.nodes(players)
text_player = text_player.merge(entered_nodes)
simulation2.alpha(1).restart()
// only select links and nodes connected to specific team node hovered upon visible
d3.selectAll("line[id*='" + l.id.replace(/[^A-Z0-9]+/ig, "_") + "']")
.each(function(d,i) {
var player = d3.select(this).attr('id')
d3.selectAll("line[id*='" + player + "']")
.style('opacity', 1)
d3.selectAll("circle[id*='" + player + "']")
.style('opacity', 1)
.attr('fill', 'white')
.attr('r', 8)
})
// only select node labels for the specific team node hovered upon visible
d3.selectAll("#" + l.id.replace(/[^A-Z0-9]+/ig, "_")).style('opacity', 1)
d3.selectAll("circle[id*='" + l.id + "']").style('opacity', 1)
})
.on('mouseout', function (l) {
d3.select(this).style("cursor", "default")
d3.selectAll(".country_player").style('opacity', 1)
d3.selectAll(".player_team").style('opacity', 1)
d3.selectAll('.team').style('opacity', 1)
d3.selectAll('.player').style('opacity', 1)
text1.style('opacity', 1)
text2.style('opacity', 1)
simulation2.stop()
d3.selectAll("line[id*='" + l.id.replace(/[^A-Z0-9]+/ig, "_") + "']")
.each(function(d,i) {
var player = d3.select(this).attr('id')
d3.selectAll("text[id*='" + player + "']")
.style('opacity', 0)
d3.selectAll("circle[id*='" + player + "']")
.attr('fill', 'grey')
.attr('r', 2)
})
simulation1
.nodes(nodes)
.on("tick", update) // start simulation to update node positions
simulation1.force("link")
.links(links)
simulation1.alpha(1).restart()
})
}
})
</script>
</body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment