Skip to content

Instantly share code, notes, and snippets.

@romsson
Created October 20, 2018 15:11
Show Gist options
  • Save romsson/8a880f9ae280dafce01956405a7e748d to your computer and use it in GitHub Desktop.
Save romsson/8a880f9ae280dafce01956405a7e748d to your computer and use it in GitHub Desktop.
ranking chart (soccer Ligue 1)
license: mit
<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
font: 15px sans-serif;
font-weight: 1000;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.x.axis path {
display: none;
}
.line {
fill: none;
stroke: steelblue;
stroke-width: 1.5px;
}
</style>
<body>
<script src="https://d3js.org/d3.v3.min.js"></script>
<script>
// Source: https://bl.ocks.org/mbostock/3884955
// Drag and drop manually on this chart
var margin = {top: 20, right: 80, bottom: 30, left: 50},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// var parseDate = d3.time.format("%Y%m%d").parse;
var parseDate = d3.time.format("%d").parse;
var ease_type = 'linear';
var x = d3.scale.linear()
.range([0, width]);
var y = d3.scale.linear()
.range([0, height]);
var color = d3.scale.category10();
var var_y = 'rank';
var var_x = 'date';
var line = d3.svg.line()
.interpolate("linear")
.x(function(d) { return x(d[var_x]); })
.y(function(d) { return y(d[var_y]); });
var svg = d3.select("body").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 + ")");
function flatten_values(data, attr) {
return Array.prototype.concat.apply([], data.map(function(d) {
return d3.values(d.values);
})).map(function(d) {
return d[attr];
});
}
d3.csv("soccer_ligue1.csv", function(error, data) {
if (error) throw error;
teams = d3.set(data.map(function(d) { return d.team })).values();
color.domain(teams)
cities = teams.map(function(team) {
return {
name: team,
values: data.filter(function(d) {
d.date = +d.day;
d.rank = +d.rank;
d.pts = +d.pts;
return d.team == team;
})
};
});
x.domain(d3.extent(flatten_values(cities, var_x)));
y.domain(d3.extent(flatten_values(cities, var_y)));
var xAxis = d3.svg.axis()
.scale(x)
.ticks(x.domain()[1])
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.style("display", "none")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Rank");
city = svg.selectAll(".city")
.data(cities)
.enter()
.append("g")
.attr("class", "city");
path = city.append("path")
.attr("class", "line")
.style("stroke-width", "10px")
.style("stroke-opacity", function(d) {
if(d.name !== "Paris SG") {
return .5;
} else {
return 1;
}
})
.attr("d", function(d) { return line(d.values); })
.style("stroke", function(d) { return color(d.name); });
city.append("text")
// .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; })
.attr("transform", function(d) {
return "translate(" + x(d.values[d.values.length - 1][var_x]) + "," + y(d.values[d.values.length - 1][var_y]) + ")";
})
.attr("x", 3)
.attr("dy", ".35em")
.attr("class", "names")
.style("fill-opacity", function(d) {
if(d.name !== "Paris SG") {
return .3;
} else {
return 1;
}
})
.text(function(d) { return d.name; });
d3.select("body").selectAll(".clearSelection").data(["absolute"]).enter().append("button")
.attr("type", "button")
.attr("class", "clearSelection")
.on("click", function() {
var_y = 'pts';
update();
})
.html("absolute");
d3.select("body").selectAll(".relative").data(["relative"]).enter().append("button")
.attr("type", "button")
.attr("class", "relative")
.on("click", function() {
var_y = 'rank';
update();
})
.html("relative");
});
function update() {
y.domain(d3.extent(flatten_values(cities, var_y)));
if(var_y === 'rank') {
ease_type = 'linear'
} else {
ease_type = 'bounce'
}
yAxis = d3.svg.axis()
.scale(y)
.orient("left");
svg.selectAll(".y.axis")
.transition().duration(1000).ease(ease_type)
.call(yAxis);
city.selectAll(".names")
.transition().duration(1000).ease(ease_type)
.attr("transform", function(d) {
return "translate(" + x(d.values[d.values.length - 1][var_x]) + "," + y(d.values[d.values.length - 1][var_y]) + ")";
});
// .attr("x", 3)
// .attr("dy", ".35em")
// .text(function(d) { return d.name; });
path.transition().duration(1000).ease(ease_type).attr("d", function(d) { return line(d.values); })
}
</script>
day pts rank team
0 0 1 Caen
1 3 1 Caen
2 6 1 Caen
3 6 5 Caen
4 6 9 Caen
5 9 5 Caen
6 12 4 Caen
7 12 4 Caen
8 15 3 Caen
9 18 2 Caen
10 21 2 Caen
11 21 3 Caen
12 21 5 Caen
13 24 3 Caen
14 25 2 Caen
15 28 2 Caen
16 29 2 Caen
17 29 3 Caen
18 30 4 Caen
19 30 4 Caen
20 30 4 Caen
21 30 7 Caen
22 33 6 Caen
23 36 4 Caen
24 36 5 Caen
25 36 6 Caen
26 36 9 Caen
27 39 6 Caen
28 42 3 Caen
29 43 6 Caen
30 43 7 Caen
31 46 6 Caen
32 46 7 Caen
33 46 8 Caen
34 46 9 Caen
35 47 9 Caen
36 48 9 Caen
37 51 8 Caen
38 54 7 Caen
0 0 2 Nantes
1 3 2 Nantes
2 4 4 Nantes
3 7 2 Nantes
4 7 5 Nantes
5 7 9 Nantes
6 7 12 Nantes
7 10 11 Nantes
8 10 11 Nantes
9 13 10 Nantes
10 16 6 Nantes
11 19 4 Nantes
12 19 7 Nantes
13 19 10 Nantes
14 19 10 Nantes
15 20 10 Nantes
16 21 11 Nantes
17 22 11 Nantes
18 23 11 Nantes
19 24 11 Nantes
20 27 9 Nantes
21 28 11 Nantes
22 29 11 Nantes
23 32 9 Nantes
24 35 7 Nantes
25 36 7 Nantes
26 39 5 Nantes
27 40 5 Nantes
28 41 5 Nantes
29 41 8 Nantes
30 44 6 Nantes
31 44 8 Nantes
32 44 10 Nantes
33 44 10 Nantes
34 44 10 Nantes
35 45 10 Nantes
36 48 10 Nantes
37 48 12 Nantes
38 48 13 Nantes
0 0 3 Reims
1 3 3 Reims
2 6 2 Reims
3 6 6 Reims
4 9 2 Reims
5 10 3 Reims
6 11 5 Reims
7 12 5 Reims
8 15 4 Reims
9 15 6 Reims
10 15 9 Reims
11 15 11 Reims
12 15 12 Reims
13 15 13 Reims
14 15 14 Reims
15 16 15 Reims
16 19 12 Reims
17 20 13 Reims
18 21 15 Reims
19 21 17 Reims
20 21 17 Reims
21 22 16 Reims
22 23 17 Reims
23 23 18 Reims
24 26 16 Reims
25 29 16 Reims
26 29 16 Reims
27 29 17 Reims
28 32 16 Reims
29 32 16 Reims
30 33 17 Reims
31 33 17 Reims
32 33 17 Reims
33 36 17 Reims
34 36 17 Reims
35 36 18 Reims
36 36 18 Reims
37 36 19 Reims
38 39 18 Reims
0 0 4 Angers
1 3 4 Angers
2 4 5 Angers
3 7 3 Angers
4 8 4 Angers
5 8 6 Angers
6 11 6 Angers
7 12 6 Angers
8 15 5 Angers
9 18 3 Angers
10 21 3 Angers
11 22 2 Angers
12 22 2 Angers
13 22 4 Angers
14 23 5 Angers
15 26 3 Angers
16 27 3 Angers
17 30 2 Angers
18 31 2 Angers
19 31 3 Angers
20 34 2 Angers
21 34 3 Angers
22 34 4 Angers
23 37 3 Angers
24 37 4 Angers
25 37 5 Angers
26 37 8 Angers
27 37 9 Angers
28 38 9 Angers
29 39 9 Angers
30 39 10 Angers
31 42 10 Angers
32 45 9 Angers
33 46 9 Angers
34 49 8 Angers
35 50 8 Angers
36 50 8 Angers
37 50 9 Angers
38 50 9 Angers
0 0 5 Bastia
1 3 5 Bastia
2 4 6 Bastia
3 7 4 Bastia
4 7 6 Bastia
5 7 10 Bastia
6 7 13 Bastia
7 7 14 Bastia
8 10 12 Bastia
9 10 13 Bastia
10 10 15 Bastia
11 10 16 Bastia
12 13 15 Bastia
13 14 15 Bastia
14 14 17 Bastia
15 15 17 Bastia
16 18 15 Bastia
17 18 18 Bastia
18 19 17 Bastia
19 22 15 Bastia
20 22 15 Bastia
21 25 14 Bastia
22 25 14 Bastia
23 28 13 Bastia
24 28 15 Bastia
25 31 12 Bastia
26 34 12 Bastia
27 35 12 Bastia
28 38 10 Bastia
29 39 10 Bastia
30 39 11 Bastia
31 40 11 Bastia
32 43 11 Bastia
33 43 11 Bastia
34 43 11 Bastia
35 43 12 Bastia
36 44 13 Bastia
37 47 13 Bastia
38 50 10 Bastia
0 0 6 Guingamp
1 0 13 Guingamp
2 0 18 Guingamp
3 0 19 Guingamp
4 3 15 Guingamp
5 6 11 Guingamp
6 9 7 Guingamp
7 9 12 Guingamp
8 10 13 Guingamp
9 13 11 Guingamp
10 14 11 Guingamp
11 15 12 Guingamp
12 16 11 Guingamp
13 16 12 Guingamp
14 19 11 Guingamp
15 19 11 Guingamp
16 19 13 Guingamp
17 19 16 Guingamp
18 19 18 Guingamp
19 19 18 Guingamp
20 20 18 Guingamp
21 21 18 Guingamp
22 24 16 Guingamp
23 27 14 Guingamp
24 30 12 Guingamp
25 31 13 Guingamp
26 31 13 Guingamp
27 31 16 Guingamp
28 32 17 Guingamp
29 32 17 Guingamp
30 35 16 Guingamp
31 38 15 Guingamp
32 39 13 Guingamp
33 39 15 Guingamp
34 42 14 Guingamp
35 43 13 Guingamp
36 43 15 Guingamp
37 44 15 Guingamp
38 44 16 Guingamp
0 0 7 Lorient
1 1 9 Lorient
2 2 11 Lorient
3 2 14 Lorient
4 2 18 Lorient
5 5 15 Lorient
6 8 9 Lorient
7 11 8 Lorient
8 11 10 Lorient
9 14 8 Lorient
10 15 10 Lorient
11 16 10 Lorient
12 17 9 Lorient
13 20 7 Lorient
14 20 9 Lorient
15 21 9 Lorient
16 22 8 Lorient
17 25 7 Lorient
18 25 8 Lorient
19 26 8 Lorient
20 27 10 Lorient
21 27 12 Lorient
22 27 12 Lorient
23 30 11 Lorient
24 30 13 Lorient
25 31 14 Lorient
26 31 14 Lorient
27 34 13 Lorient
28 37 11 Lorient
29 38 11 Lorient
30 39 12 Lorient
31 39 12 Lorient
32 39 14 Lorient
33 42 13 Lorient
34 43 12 Lorient
35 43 14 Lorient
36 43 16 Lorient
37 43 16 Lorient
38 46 15 Lorient
0 0 8 Marseille
1 0 14 Marseille
2 0 19 Marseille
3 3 13 Marseille
4 3 16 Marseille
5 6 12 Marseille
6 7 14 Marseille
7 8 13 Marseille
8 8 15 Marseille
9 8 16 Marseille
10 9 16 Marseille
11 12 14 Marseille
12 15 13 Marseille
13 15 14 Marseille
14 18 12 Marseille
15 19 12 Marseille
16 22 9 Marseille
17 23 9 Marseille
18 24 9 Marseille
19 25 10 Marseille
20 26 11 Marseille
21 29 8 Marseille
22 30 8 Marseille
23 31 10 Marseille
24 34 8 Marseille
25 34 10 Marseille
26 35 11 Marseille
27 36 11 Marseille
28 37 12 Marseille
29 38 12 Marseille
30 39 13 Marseille
31 39 13 Marseille
32 39 15 Marseille
33 40 14 Marseille
34 40 15 Marseille
35 41 16 Marseille
36 44 14 Marseille
37 47 14 Marseille
38 48 14 Marseille
0 0 9 Montpellier
1 0 15 Montpellier
2 0 20 Montpellier
3 0 20 Montpellier
4 1 19 Montpellier
5 1 19 Montpellier
6 1 19 Montpellier
7 1 20 Montpellier
8 4 18 Montpellier
9 4 18 Montpellier
10 5 18 Montpellier
11 8 17 Montpellier
12 9 17 Montpellier
13 12 17 Montpellier
14 15 15 Montpellier
15 18 13 Montpellier
16 18 16 Montpellier
17 19 17 Montpellier
18 22 13 Montpellier
19 22 16 Montpellier
20 22 16 Montpellier
21 22 17 Montpellier
22 22 18 Montpellier
23 25 17 Montpellier
24 25 18 Montpellier
25 26 18 Montpellier
26 29 17 Montpellier
27 32 15 Montpellier
28 35 14 Montpellier
29 36 15 Montpellier
30 36 15 Montpellier
31 36 16 Montpellier
32 37 16 Montpellier
33 37 16 Montpellier
34 40 16 Montpellier
35 43 15 Montpellier
36 46 12 Montpellier
37 49 11 Montpellier
38 49 12 Montpellier
0 0 10 Rennes
1 0 16 Rennes
2 3 9 Rennes
3 6 7 Rennes
4 9 3 Rennes
5 12 2 Rennes
6 13 2 Rennes
7 14 3 Rennes
8 15 6 Rennes
9 16 4 Rennes
10 16 7 Rennes
11 17 7 Rennes
12 17 10 Rennes
13 20 8 Rennes
14 21 8 Rennes
15 22 8 Rennes
16 22 10 Rennes
17 23 10 Rennes
18 24 10 Rennes
19 27 7 Rennes
20 28 8 Rennes
21 31 6 Rennes
22 34 5 Rennes
23 34 6 Rennes
24 34 9 Rennes
25 35 9 Rennes
26 38 7 Rennes
27 38 8 Rennes
28 41 6 Rennes
29 44 4 Rennes
30 45 5 Rennes
31 48 5 Rennes
32 51 4 Rennes
33 51 5 Rennes
34 51 7 Rennes
35 52 7 Rennes
36 52 7 Rennes
37 52 7 Rennes
38 52 8 Rennes
0 0 11 Monaco
1 3 6 Monaco
2 4 7 Monaco
3 5 8 Monaco
4 5 10 Monaco
5 8 7 Monaco
6 8 10 Monaco
7 11 9 Monaco
8 12 8 Monaco
9 13 12 Monaco
10 14 12 Monaco
11 17 8 Monaco
12 20 6 Monaco
13 20 9 Monaco
14 23 6 Monaco
15 24 6 Monaco
16 25 5 Monaco
17 28 4 Monaco
18 31 3 Monaco
19 32 2 Monaco
20 33 3 Monaco
21 36 2 Monaco
22 39 2 Monaco
23 39 2 Monaco
24 42 2 Monaco
25 45 2 Monaco
26 46 2 Monaco
27 49 2 Monaco
28 50 2 Monaco
29 51 2 Monaco
30 52 2 Monaco
31 55 2 Monaco
32 55 2 Monaco
33 55 2 Monaco
34 58 2 Monaco
35 59 2 Monaco
36 62 2 Monaco
37 62 3 Monaco
38 65 2 Monaco
0 0 12 St Etienne
1 0 17 St Etienne
2 1 13 St Etienne
3 4 9 St Etienne
4 7 7 St Etienne
5 10 4 St Etienne
6 13 3 St Etienne
7 16 2 St Etienne
8 16 2 St Etienne
9 16 5 St Etienne
10 19 4 St Etienne
11 19 5 St Etienne
12 22 3 St Etienne
13 22 5 St Etienne
14 22 7 St Etienne
15 25 4 St Etienne
16 25 6 St Etienne
17 26 5 St Etienne
18 26 5 St Etienne
19 29 5 St Etienne
20 29 6 St Etienne
21 32 5 St Etienne
22 33 7 St Etienne
23 33 7 St Etienne
24 36 6 St Etienne
25 39 3 St Etienne
26 40 3 St Etienne
27 41 3 St Etienne
28 41 7 St Etienne
29 42 7 St Etienne
30 42 8 St Etienne
31 45 7 St Etienne
32 48 6 St Etienne
33 51 6 St Etienne
34 54 4 St Etienne
35 57 4 St Etienne
36 58 4 St Etienne
37 58 5 St Etienne
38 58 6 St Etienne
0 0 13 Bordeaux
1 0 18 Bordeaux
2 1 14 Bordeaux
3 2 15 Bordeaux
4 5 11 Bordeaux
5 6 13 Bordeaux
6 7 15 Bordeaux
7 7 15 Bordeaux
8 10 14 Bordeaux
9 10 14 Bordeaux
10 11 13 Bordeaux
11 14 13 Bordeaux
12 14 14 Bordeaux
13 17 11 Bordeaux
14 18 13 Bordeaux
15 18 14 Bordeaux
16 18 17 Bordeaux
17 21 12 Bordeaux
18 22 14 Bordeaux
19 23 14 Bordeaux
20 26 12 Bordeaux
21 29 9 Bordeaux
22 30 9 Bordeaux
23 33 8 Bordeaux
24 33 10 Bordeaux
25 33 11 Bordeaux
26 36 10 Bordeaux
27 37 10 Bordeaux
28 37 13 Bordeaux
29 38 13 Bordeaux
30 38 14 Bordeaux
31 39 14 Bordeaux
32 42 12 Bordeaux
33 43 12 Bordeaux
34 43 13 Bordeaux
35 44 11 Bordeaux
36 47 11 Bordeaux
37 50 10 Bordeaux
38 50 11 Bordeaux
0 0 14 Lille
1 0 19 Lille
2 1 15 Lille
3 2 16 Lille
4 5 12 Lille
5 6 14 Lille
6 7 16 Lille
7 7 16 Lille
8 7 16 Lille
9 10 15 Lille
10 11 14 Lille
11 11 15 Lille
12 12 16 Lille
13 13 16 Lille
14 14 18 Lille
15 14 18 Lille
16 17 18 Lille
17 20 14 Lille
18 23 12 Lille
19 24 12 Lille
20 25 13 Lille
21 25 15 Lille
22 25 15 Lille
23 26 15 Lille
24 29 14 Lille
25 30 15 Lille
26 31 15 Lille
27 34 14 Lille
28 34 15 Lille
29 37 14 Lille
30 40 9 Lille
31 43 9 Lille
32 46 8 Lille
33 49 7 Lille
34 52 6 Lille
35 53 6 Lille
36 56 6 Lille
37 57 6 Lille
38 60 5 Lille
0 0 15 Paris SG
1 3 7 Paris SG
2 6 3 Paris SG
3 9 1 Paris SG
4 12 1 Paris SG
5 13 1 Paris SG
6 14 1 Paris SG
7 17 1 Paris SG
8 20 1 Paris SG
9 23 1 Paris SG
10 26 1 Paris SG
11 29 1 Paris SG
12 32 1 Paris SG
13 35 1 Paris SG
14 38 1 Paris SG
15 41 1 Paris SG
16 42 1 Paris SG
17 45 1 Paris SG
18 48 1 Paris SG
19 51 1 Paris SG
20 54 1 Paris SG
21 57 1 Paris SG
22 60 1 Paris SG
23 63 1 Paris SG
24 66 1 Paris SG
25 69 1 Paris SG
26 70 1 Paris SG
27 73 1 Paris SG
28 73 1 Paris SG
29 74 1 Paris SG
30 77 1 Paris SG
31 77 1 Paris SG
32 80 1 Paris SG
33 83 1 Paris SG
34 86 1 Paris SG
35 87 1 Paris SG
36 90 1 Paris SG
37 93 1 Paris SG
38 96 1 Paris SG
0 0 16 Troyes
1 1 10 Troyes
2 2 12 Troyes
3 2 17 Troyes
4 3 17 Troyes
5 3 18 Troyes
6 3 18 Troyes
7 3 18 Troyes
8 4 19 Troyes
9 4 19 Troyes
10 4 19 Troyes
11 4 20 Troyes
12 4 20 Troyes
13 4 20 Troyes
14 5 20 Troyes
15 5 20 Troyes
16 5 20 Troyes
17 6 20 Troyes
18 7 20 Troyes
19 8 20 Troyes
20 8 20 Troyes
21 8 20 Troyes
22 11 20 Troyes
23 11 20 Troyes
24 11 20 Troyes
25 11 20 Troyes
26 14 20 Troyes
27 14 20 Troyes
28 14 20 Troyes
29 14 20 Troyes
30 14 20 Troyes
31 14 20 Troyes
32 14 20 Troyes
33 14 20 Troyes
34 17 20 Troyes
35 17 20 Troyes
36 17 20 Troyes
37 17 20 Troyes
38 18 20 Troyes
0 0 17 Lyon
1 1 11 Lyon
2 4 8 Lyon
3 4 10 Lyon
4 7 8 Lyon
5 8 8 Lyon
6 9 8 Lyon
7 12 7 Lyon
8 12 9 Lyon
9 15 7 Lyon
10 16 8 Lyon
11 19 6 Lyon
12 22 4 Lyon
13 25 2 Lyon
14 25 3 Lyon
15 25 5 Lyon
16 26 4 Lyon
17 26 6 Lyon
18 26 6 Lyon
19 26 9 Lyon
20 29 7 Lyon
21 29 10 Lyon
22 30 10 Lyon
23 30 12 Lyon
24 33 11 Lyon
25 36 8 Lyon
26 39 6 Lyon
27 39 7 Lyon
28 42 4 Lyon
29 45 3 Lyon
30 46 4 Lyon
31 49 4 Lyon
32 52 3 Lyon
33 55 3 Lyon
34 56 3 Lyon
35 59 3 Lyon
36 62 3 Lyon
37 65 2 Lyon
38 65 3 Lyon
0 0 18 Nice
1 0 20 Nice
2 1 16 Nice
3 4 11 Nice
4 5 13 Nice
5 5 16 Nice
6 8 11 Nice
7 11 10 Nice
8 14 7 Nice
9 14 9 Nice
10 17 5 Nice
11 17 9 Nice
12 18 8 Nice
13 21 6 Nice
14 24 4 Nice
15 24 7 Nice
16 25 7 Nice
17 25 8 Nice
18 26 7 Nice
19 29 6 Nice
20 30 5 Nice
21 33 4 Nice
22 36 3 Nice
23 36 5 Nice
24 39 3 Nice
25 39 4 Nice
26 40 4 Nice
27 41 4 Nice
28 41 8 Nice
29 44 5 Nice
30 47 3 Nice
31 50 3 Nice
32 50 5 Nice
33 53 4 Nice
34 54 5 Nice
35 57 5 Nice
36 57 5 Nice
37 60 4 Nice
38 63 4 Nice
0 0 19 Toulouse
1 3 8 Toulouse
2 3 10 Toulouse
3 4 12 Toulouse
4 4 14 Toulouse
5 5 17 Toulouse
6 6 17 Toulouse
7 7 17 Toulouse
8 7 17 Toulouse
9 8 17 Toulouse
10 8 17 Toulouse
11 8 18 Toulouse
12 9 18 Toulouse
13 9 19 Toulouse
14 9 19 Toulouse
15 12 19 Toulouse
16 15 19 Toulouse
17 15 19 Toulouse
18 16 19 Toulouse
19 17 19 Toulouse
20 20 19 Toulouse
21 20 19 Toulouse
22 20 19 Toulouse
23 20 19 Toulouse
24 20 19 Toulouse
25 21 19 Toulouse
26 21 19 Toulouse
27 22 19 Toulouse
28 22 19 Toulouse
29 23 19 Toulouse
30 26 19 Toulouse
31 26 19 Toulouse
32 29 19 Toulouse
33 32 19 Toulouse
34 33 19 Toulouse
35 33 19 Toulouse
36 34 19 Toulouse
37 37 17 Toulouse
38 40 17 Toulouse
0 0 20 Gaz. Ajaccio
1 1 12 Gaz. Ajaccio
2 1 17 Gaz. Ajaccio
3 1 18 Gaz. Ajaccio
4 1 20 Gaz. Ajaccio
5 1 20 Gaz. Ajaccio
6 1 20 Gaz. Ajaccio
7 2 19 Gaz. Ajaccio
8 2 20 Gaz. Ajaccio
9 3 20 Gaz. Ajaccio
10 3 20 Gaz. Ajaccio
11 6 19 Gaz. Ajaccio
12 9 19 Gaz. Ajaccio
13 12 18 Gaz. Ajaccio
14 15 16 Gaz. Ajaccio
15 16 16 Gaz. Ajaccio
16 19 14 Gaz. Ajaccio
17 20 15 Gaz. Ajaccio
18 21 16 Gaz. Ajaccio
19 24 13 Gaz. Ajaccio
20 25 14 Gaz. Ajaccio
21 26 13 Gaz. Ajaccio
22 26 13 Gaz. Ajaccio
23 26 16 Gaz. Ajaccio
24 26 17 Gaz. Ajaccio
25 27 17 Gaz. Ajaccio
26 27 18 Gaz. Ajaccio
27 28 18 Gaz. Ajaccio
28 29 18 Gaz. Ajaccio
29 30 18 Gaz. Ajaccio
30 33 18 Gaz. Ajaccio
31 33 18 Gaz. Ajaccio
32 33 18 Gaz. Ajaccio
33 34 18 Gaz. Ajaccio
34 34 18 Gaz. Ajaccio
35 37 17 Gaz. Ajaccio
36 37 17 Gaz. Ajaccio
37 37 18 Gaz. Ajaccio
38 37 19 Gaz. Ajaccio
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment