Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Adaptation of Mike Bostock's Force-Directed Graph of Les Mis Characters using .csv dataset instead of json

##Fork of Mike Bostock's original force-directed example. This fork uses an ugly csv which unfortunately is just a fact of life in my world. JSON is highly recommended unless it is unavailable.

##Original readme.md is below and does a very nice job of explaining the graph.

This simple force-directed graph shows character co-occurence in Les Misérables. A physical simulation of charged particles and springs places related characters in closer proximity, while unrelated characters are farther apart. Layout algorithm inspired by Tim Dwyer and Thomas Jakobsen. Data based on character coappearence in Victor Hugo's Les Misérables, compiled by Donald Knuth.

<!DOCTYPE html>
<meta charset="utf-8">
<style>
.node {
stroke: #fff;
stroke-width: 1.5px;
}
.link {
stroke: #999;
stroke-opacity: .6;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.js"></script>
<script>
var width = 960,
height = 500;
var color = d3.scale.category20();
var force = d3.layout.force()
.charge(-120)
.linkDistance(30)
.size([width, height]);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
d3.csv("les_mis.csv", function (error, data) {
//set up graph in same style as original example but empty
graph = { "nodes": [], "links": [] };
//loop through each link record from the csv data
//add to the nodes each source and target; we'll reduce to unique values later
//add to the links each source, target record with the value (if desired, multiple value fields can be added)
data.forEach(function (d) {
graph.nodes.push({ "name": d.source, "group": +d.groupsource });
graph.nodes.push({ "name": d.target, "group": +d.grouptarget });
graph.links.push({ "source": d.source, "target": d.target, "value": +d.value });
});
//use this as temporary holding while we manipulate graph.nodes
//this will contain a map object containing an object for each node
//within each node object there will be a child object for each instance that node appear
//however, using rollup we can eliminate this duplication
var nodesmap = d3.nest()
.key(function (d) { return d.name; })
.rollup(function (d) { return { "name": d[0].name, "group": d[0].group }; })
.map(graph.nodes);
//thanks Mike Bostock https://groups.google.com/d/msg/d3-js/pl297cFtIQk/Eso4q_eBu1IJ
//this handy little function returns only the distinct / unique nodes
graph.nodes = d3.keys(d3.nest()
.key(function (d) { return d.name; })
.map(graph.nodes));
//it appears d3 with force layout wants a numeric source and target
//so loop through each link replacing the text with its index from node
graph.links.forEach(function (d, i) {
graph.links[i].source = graph.nodes.indexOf(graph.links[i].source);
graph.links[i].target = graph.nodes.indexOf(graph.links[i].target);
});
//this is not in the least bit pretty
//will get graph.nodes in its final useable form
//loop through each unique node and replace with an object with same numeric key and name/group as properties
//that will come from the nodesmap that we defined earlier
graph.nodes.forEach(function (d,i) { graph.nodes[i]={ "name": nodesmap[d].name, "group": nodesmap[d].group }; })
force
.nodes(graph.nodes)
.links(graph.links)
.start();
var link = svg.selectAll(".link")
.data(graph.links)
.enter().append("line")
.attr("class", "link")
.style("stroke-width", function (d) { return Math.sqrt(d.value); });
var node = svg.selectAll(".node")
.data(graph.nodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", 5)
.style("fill", function (d) { return color(d.group); })
.call(force.drag);
node.append("title")
.text(function (d) { return d.name; });
force.on("tick", function () {
link.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; });
node.attr("cx", function (d) { return d.x; })
.attr("cy", function (d) { return d.y; });
});
});
</script>
</body>
</html>
source target value groupsource grouptarget
Napoleon Myriel 1 1 1
Mlle.Baptistine Myriel 8 1 1
Mme.Magloire Myriel 10 1 1
Mme.Magloire Mlle.Baptistine 6 1 1
CountessdeLo Myriel 1 1 1
Geborand Myriel 1 1 1
Champtercier Myriel 1 1 1
Cravatte Myriel 1 1 1
Count Myriel 2 1 1
OldMan Myriel 1 1 1
Valjean Labarre 1 2 2
Valjean Mme.Magloire 3 2 1
Valjean Mlle.Baptistine 3 2 1
Valjean Myriel 5 2 1
Marguerite Valjean 1 3 2
Mme.deR Valjean 1 2 2
Isabeau Valjean 1 2 2
Gervais Valjean 1 2 2
Listolier Tholomyes 4 3 3
Fameuil Tholomyes 4 3 3
Fameuil Listolier 4 3 3
Blacheville Tholomyes 4 3 3
Blacheville Listolier 4 3 3
Blacheville Fameuil 4 3 3
Favourite Tholomyes 3 3 3
Favourite Listolier 3 3 3
Favourite Fameuil 3 3 3
Favourite Blacheville 4 3 3
Dahlia Tholomyes 3 3 3
Dahlia Listolier 3 3 3
Dahlia Fameuil 3 3 3
Dahlia Blacheville 3 3 3
Dahlia Favourite 5 3 3
Zephine Tholomyes 3 3 3
Zephine Listolier 3 3 3
Zephine Fameuil 3 3 3
Zephine Blacheville 3 3 3
Zephine Favourite 4 3 3
Zephine Dahlia 4 3 3
Fantine Tholomyes 3 3 3
Fantine Listolier 3 3 3
Fantine Fameuil 3 3 3
Fantine Blacheville 3 3 3
Fantine Favourite 4 3 3
Fantine Dahlia 4 3 3
Fantine Zephine 4 3 3
Fantine Marguerite 2 3 3
Fantine Valjean 9 3 2
Mme.Thenardier Fantine 2 4 3
Mme.Thenardier Valjean 7 4 2
Thenardier Mme.Thenardier 13 4 4
Thenardier Fantine 1 4 3
Thenardier Valjean 12 4 2
Cosette Mme.Thenardier 4 5 4
Cosette Valjean 31 5 2
Cosette Tholomyes 1 5 3
Cosette Thenardier 1 5 4
Javert Valjean 17 4 2
Javert Fantine 5 4 3
Javert Thenardier 5 4 4
Javert Mme.Thenardier 1 4 4
Javert Cosette 1 4 5
Fauchelevent Valjean 8 0 2
Fauchelevent Javert 1 0 4
Bamatabois Fantine 1 2 3
Bamatabois Javert 1 2 4
Bamatabois Valjean 2 2 2
Perpetue Fantine 1 3 3
Simplice Perpetue 2 2 3
Simplice Valjean 3 2 2
Simplice Fantine 2 2 3
Simplice Javert 1 2 4
Scaufflaire Valjean 1 2 2
Woman1 Valjean 2 2 2
Woman1 Javert 1 2 4
Judge Valjean 3 2 2
Judge Bamatabois 2 2 2
Champmathieu Valjean 3 2 2
Champmathieu Judge 3 2 2
Champmathieu Bamatabois 2 2 2
Brevet Judge 2 2 2
Brevet Champmathieu 2 2 2
Brevet Valjean 2 2 2
Brevet Bamatabois 1 2 2
Chenildieu Judge 2 2 2
Chenildieu Champmathieu 2 2 2
Chenildieu Brevet 2 2 2
Chenildieu Valjean 2 2 2
Chenildieu Bamatabois 1 2 2
Cochepaille Judge 2 2 2
Cochepaille Champmathieu 2 2 2
Cochepaille Brevet 2 2 2
Cochepaille Chenildieu 2 2 2
Cochepaille Valjean 2 2 2
Cochepaille Bamatabois 1 2 2
Pontmercy Thenardier 1 4 4
Boulatruelle Thenardier 1 6 4
Eponine Mme.Thenardier 2 4 4
Eponine Thenardier 3 4 4
Anzelma Eponine 2 4 4
Anzelma Thenardier 2 4 4
Anzelma Mme.Thenardier 1 4 4
Woman2 Valjean 3 5 2
Woman2 Cosette 1 5 5
Woman2 Javert 1 5 4
MotherInnocent Fauchelevent 3 0 0
MotherInnocent Valjean 1 0 2
Gribier Fauchelevent 2 0 0
Mme.Burgon Jondrette 1 7 7
Gavroche Mme.Burgon 2 8 7
Gavroche Thenardier 1 8 4
Gavroche Javert 1 8 4
Gavroche Valjean 1 8 2
Gillenormand Cosette 3 5 5
Gillenormand Valjean 2 5 2
Magnon Gillenormand 1 5 5
Magnon Mme.Thenardier 1 5 4
Mlle.Gillenormand Gillenormand 9 5 5
Mlle.Gillenormand Cosette 2 5 5
Mlle.Gillenormand Valjean 2 5 2
Mme.Pontmercy Mlle.Gillenormand 1 5 5
Mme.Pontmercy Pontmercy 1 5 4
Mlle.Vaubois Mlle.Gillenormand 1 5 5
Lt.Gillenormand Mlle.Gillenormand 2 5 5
Lt.Gillenormand Gillenormand 1 5 5
Lt.Gillenormand Cosette 1 5 5
Marius Mlle.Gillenormand 6 8 5
Marius Gillenormand 12 8 5
Marius Pontmercy 1 8 4
Marius Lt.Gillenormand 1 8 5
Marius Cosette 21 8 5
Marius Valjean 19 8 2
Marius Tholomyes 1 8 3
Marius Thenardier 2 8 4
Marius Eponine 5 8 4
Marius Gavroche 4 8 8
BaronessT Gillenormand 1 5 5
BaronessT Marius 1 5 8
Mabeuf Marius 1 8 8
Mabeuf Eponine 1 8 4
Mabeuf Gavroche 1 8 8
Enjolras Marius 7 8 8
Enjolras Gavroche 7 8 8
Enjolras Javert 6 8 4
Enjolras Mabeuf 1 8 8
Enjolras Valjean 4 8 2
Combeferre Enjolras 15 8 8
Combeferre Marius 5 8 8
Combeferre Gavroche 6 8 8
Combeferre Mabeuf 2 8 8
Prouvaire Gavroche 1 8 8
Prouvaire Enjolras 4 8 8
Prouvaire Combeferre 2 8 8
Feuilly Gavroche 2 8 8
Feuilly Enjolras 6 8 8
Feuilly Prouvaire 2 8 8
Feuilly Combeferre 5 8 8
Feuilly Mabeuf 1 8 8
Feuilly Marius 1 8 8
Courfeyrac Marius 9 8 8
Courfeyrac Enjolras 17 8 8
Courfeyrac Combeferre 13 8 8
Courfeyrac Gavroche 7 8 8
Courfeyrac Mabeuf 2 8 8
Courfeyrac Eponine 1 8 4
Courfeyrac Feuilly 6 8 8
Courfeyrac Prouvaire 3 8 8
Bahorel Combeferre 5 8 8
Bahorel Gavroche 5 8 8
Bahorel Courfeyrac 6 8 8
Bahorel Mabeuf 2 8 8
Bahorel Enjolras 4 8 8
Bahorel Feuilly 3 8 8
Bahorel Prouvaire 2 8 8
Bahorel Marius 1 8 8
Bossuet Marius 5 8 8
Bossuet Courfeyrac 12 8 8
Bossuet Gavroche 5 8 8
Bossuet Bahorel 4 8 8
Bossuet Enjolras 10 8 8
Bossuet Feuilly 6 8 8
Bossuet Prouvaire 2 8 8
Bossuet Combeferre 9 8 8
Bossuet Mabeuf 1 8 8
Bossuet Valjean 1 8 2
Joly Bahorel 5 8 8
Joly Bossuet 7 8 8
Joly Gavroche 3 8 8
Joly Courfeyrac 5 8 8
Joly Enjolras 5 8 8
Joly Feuilly 5 8 8
Joly Prouvaire 2 8 8
Joly Combeferre 5 8 8
Joly Mabeuf 1 8 8
Joly Marius 2 8 8
Grantaire Bossuet 3 8 8
Grantaire Enjolras 3 8 8
Grantaire Combeferre 1 8 8
Grantaire Courfeyrac 2 8 8
Grantaire Joly 2 8 8
Grantaire Gavroche 1 8 8
Grantaire Bahorel 1 8 8
Grantaire Feuilly 1 8 8
Grantaire Prouvaire 1 8 8
MotherPlutarch Mabeuf 3 9 8
Gueulemer Thenardier 5 4 4
Gueulemer Valjean 1 4 2
Gueulemer Mme.Thenardier 1 4 4
Gueulemer Javert 1 4 4
Gueulemer Gavroche 1 4 8
Gueulemer Eponine 1 4 4
Babet Thenardier 6 4 4
Babet Gueulemer 6 4 4
Babet Valjean 1 4 2
Babet Mme.Thenardier 1 4 4
Babet Javert 2 4 4
Babet Gavroche 1 4 8
Babet Eponine 1 4 4
Claquesous Thenardier 4 4 4
Claquesous Babet 4 4 4
Claquesous Gueulemer 4 4 4
Claquesous Valjean 1 4 2
Claquesous Mme.Thenardier 1 4 4
Claquesous Javert 1 4 4
Claquesous Eponine 1 4 4
Claquesous Enjolras 1 4 8
Montparnasse Javert 1 4 4
Montparnasse Babet 2 4 4
Montparnasse Gueulemer 2 4 4
Montparnasse Claquesous 2 4 4
Montparnasse Valjean 1 4 2
Montparnasse Gavroche 1 4 8
Montparnasse Eponine 1 4 4
Montparnasse Thenardier 1 4 4
Toussaint Cosette 2 5 5
Toussaint Javert 1 5 4
Toussaint Valjean 1 5 2
Child1 Gavroche 2 10 8
Child2 Gavroche 2 10 8
Child2 Child1 3 10 10
Brujon Babet 3 4 4
Brujon Gueulemer 3 4 4
Brujon Thenardier 3 4 4
Brujon Gavroche 1 4 8
Brujon Eponine 1 4 4
Brujon Claquesous 1 4 4
Brujon Montparnasse 1 4 4
Mme.Hucheloup Bossuet 1 8 8
Mme.Hucheloup Joly 1 8 8
Mme.Hucheloup Grantaire 1 8 8
Mme.Hucheloup Bahorel 1 8 8
Mme.Hucheloup Courfeyrac 1 8 8
Mme.Hucheloup Gavroche 1 8 8
Mme.Hucheloup Enjolras 1 8 8
{
"nodes":[
{"name":"Myriel","group":1},
{"name":"Napoleon","group":1},
{"name":"Mlle.Baptistine","group":1},
{"name":"Mme.Magloire","group":1},
{"name":"CountessdeLo","group":1},
{"name":"Geborand","group":1},
{"name":"Champtercier","group":1},
{"name":"Cravatte","group":1},
{"name":"Count","group":1},
{"name":"OldMan","group":1},
{"name":"Labarre","group":2},
{"name":"Valjean","group":2},
{"name":"Marguerite","group":3},
{"name":"Mme.deR","group":2},
{"name":"Isabeau","group":2},
{"name":"Gervais","group":2},
{"name":"Tholomyes","group":3},
{"name":"Listolier","group":3},
{"name":"Fameuil","group":3},
{"name":"Blacheville","group":3},
{"name":"Favourite","group":3},
{"name":"Dahlia","group":3},
{"name":"Zephine","group":3},
{"name":"Fantine","group":3},
{"name":"Mme.Thenardier","group":4},
{"name":"Thenardier","group":4},
{"name":"Cosette","group":5},
{"name":"Javert","group":4},
{"name":"Fauchelevent","group":0},
{"name":"Bamatabois","group":2},
{"name":"Perpetue","group":3},
{"name":"Simplice","group":2},
{"name":"Scaufflaire","group":2},
{"name":"Woman1","group":2},
{"name":"Judge","group":2},
{"name":"Champmathieu","group":2},
{"name":"Brevet","group":2},
{"name":"Chenildieu","group":2},
{"name":"Cochepaille","group":2},
{"name":"Pontmercy","group":4},
{"name":"Boulatruelle","group":6},
{"name":"Eponine","group":4},
{"name":"Anzelma","group":4},
{"name":"Woman2","group":5},
{"name":"MotherInnocent","group":0},
{"name":"Gribier","group":0},
{"name":"Jondrette","group":7},
{"name":"Mme.Burgon","group":7},
{"name":"Gavroche","group":8},
{"name":"Gillenormand","group":5},
{"name":"Magnon","group":5},
{"name":"Mlle.Gillenormand","group":5},
{"name":"Mme.Pontmercy","group":5},
{"name":"Mlle.Vaubois","group":5},
{"name":"Lt.Gillenormand","group":5},
{"name":"Marius","group":8},
{"name":"BaronessT","group":5},
{"name":"Mabeuf","group":8},
{"name":"Enjolras","group":8},
{"name":"Combeferre","group":8},
{"name":"Prouvaire","group":8},
{"name":"Feuilly","group":8},
{"name":"Courfeyrac","group":8},
{"name":"Bahorel","group":8},
{"name":"Bossuet","group":8},
{"name":"Joly","group":8},
{"name":"Grantaire","group":8},
{"name":"MotherPlutarch","group":9},
{"name":"Gueulemer","group":4},
{"name":"Babet","group":4},
{"name":"Claquesous","group":4},
{"name":"Montparnasse","group":4},
{"name":"Toussaint","group":5},
{"name":"Child1","group":10},
{"name":"Child2","group":10},
{"name":"Brujon","group":4},
{"name":"Mme.Hucheloup","group":8}
],
"links":[
{"source":1,"target":0,"value":1},
{"source":2,"target":0,"value":8},
{"source":3,"target":0,"value":10},
{"source":3,"target":2,"value":6},
{"source":4,"target":0,"value":1},
{"source":5,"target":0,"value":1},
{"source":6,"target":0,"value":1},
{"source":7,"target":0,"value":1},
{"source":8,"target":0,"value":2},
{"source":9,"target":0,"value":1},
{"source":11,"target":10,"value":1},
{"source":11,"target":3,"value":3},
{"source":11,"target":2,"value":3},
{"source":11,"target":0,"value":5},
{"source":12,"target":11,"value":1},
{"source":13,"target":11,"value":1},
{"source":14,"target":11,"value":1},
{"source":15,"target":11,"value":1},
{"source":17,"target":16,"value":4},
{"source":18,"target":16,"value":4},
{"source":18,"target":17,"value":4},
{"source":19,"target":16,"value":4},
{"source":19,"target":17,"value":4},
{"source":19,"target":18,"value":4},
{"source":20,"target":16,"value":3},
{"source":20,"target":17,"value":3},
{"source":20,"target":18,"value":3},
{"source":20,"target":19,"value":4},
{"source":21,"target":16,"value":3},
{"source":21,"target":17,"value":3},
{"source":21,"target":18,"value":3},
{"source":21,"target":19,"value":3},
{"source":21,"target":20,"value":5},
{"source":22,"target":16,"value":3},
{"source":22,"target":17,"value":3},
{"source":22,"target":18,"value":3},
{"source":22,"target":19,"value":3},
{"source":22,"target":20,"value":4},
{"source":22,"target":21,"value":4},
{"source":23,"target":16,"value":3},
{"source":23,"target":17,"value":3},
{"source":23,"target":18,"value":3},
{"source":23,"target":19,"value":3},
{"source":23,"target":20,"value":4},
{"source":23,"target":21,"value":4},
{"source":23,"target":22,"value":4},
{"source":23,"target":12,"value":2},
{"source":23,"target":11,"value":9},
{"source":24,"target":23,"value":2},
{"source":24,"target":11,"value":7},
{"source":25,"target":24,"value":13},
{"source":25,"target":23,"value":1},
{"source":25,"target":11,"value":12},
{"source":26,"target":24,"value":4},
{"source":26,"target":11,"value":31},
{"source":26,"target":16,"value":1},
{"source":26,"target":25,"value":1},
{"source":27,"target":11,"value":17},
{"source":27,"target":23,"value":5},
{"source":27,"target":25,"value":5},
{"source":27,"target":24,"value":1},
{"source":27,"target":26,"value":1},
{"source":28,"target":11,"value":8},
{"source":28,"target":27,"value":1},
{"source":29,"target":23,"value":1},
{"source":29,"target":27,"value":1},
{"source":29,"target":11,"value":2},
{"source":30,"target":23,"value":1},
{"source":31,"target":30,"value":2},
{"source":31,"target":11,"value":3},
{"source":31,"target":23,"value":2},
{"source":31,"target":27,"value":1},
{"source":32,"target":11,"value":1},
{"source":33,"target":11,"value":2},
{"source":33,"target":27,"value":1},
{"source":34,"target":11,"value":3},
{"source":34,"target":29,"value":2},
{"source":35,"target":11,"value":3},
{"source":35,"target":34,"value":3},
{"source":35,"target":29,"value":2},
{"source":36,"target":34,"value":2},
{"source":36,"target":35,"value":2},
{"source":36,"target":11,"value":2},
{"source":36,"target":29,"value":1},
{"source":37,"target":34,"value":2},
{"source":37,"target":35,"value":2},
{"source":37,"target":36,"value":2},
{"source":37,"target":11,"value":2},
{"source":37,"target":29,"value":1},
{"source":38,"target":34,"value":2},
{"source":38,"target":35,"value":2},
{"source":38,"target":36,"value":2},
{"source":38,"target":37,"value":2},
{"source":38,"target":11,"value":2},
{"source":38,"target":29,"value":1},
{"source":39,"target":25,"value":1},
{"source":40,"target":25,"value":1},
{"source":41,"target":24,"value":2},
{"source":41,"target":25,"value":3},
{"source":42,"target":41,"value":2},
{"source":42,"target":25,"value":2},
{"source":42,"target":24,"value":1},
{"source":43,"target":11,"value":3},
{"source":43,"target":26,"value":1},
{"source":43,"target":27,"value":1},
{"source":44,"target":28,"value":3},
{"source":44,"target":11,"value":1},
{"source":45,"target":28,"value":2},
{"source":47,"target":46,"value":1},
{"source":48,"target":47,"value":2},
{"source":48,"target":25,"value":1},
{"source":48,"target":27,"value":1},
{"source":48,"target":11,"value":1},
{"source":49,"target":26,"value":3},
{"source":49,"target":11,"value":2},
{"source":50,"target":49,"value":1},
{"source":50,"target":24,"value":1},
{"source":51,"target":49,"value":9},
{"source":51,"target":26,"value":2},
{"source":51,"target":11,"value":2},
{"source":52,"target":51,"value":1},
{"source":52,"target":39,"value":1},
{"source":53,"target":51,"value":1},
{"source":54,"target":51,"value":2},
{"source":54,"target":49,"value":1},
{"source":54,"target":26,"value":1},
{"source":55,"target":51,"value":6},
{"source":55,"target":49,"value":12},
{"source":55,"target":39,"value":1},
{"source":55,"target":54,"value":1},
{"source":55,"target":26,"value":21},
{"source":55,"target":11,"value":19},
{"source":55,"target":16,"value":1},
{"source":55,"target":25,"value":2},
{"source":55,"target":41,"value":5},
{"source":55,"target":48,"value":4},
{"source":56,"target":49,"value":1},
{"source":56,"target":55,"value":1},
{"source":57,"target":55,"value":1},
{"source":57,"target":41,"value":1},
{"source":57,"target":48,"value":1},
{"source":58,"target":55,"value":7},
{"source":58,"target":48,"value":7},
{"source":58,"target":27,"value":6},
{"source":58,"target":57,"value":1},
{"source":58,"target":11,"value":4},
{"source":59,"target":58,"value":15},
{"source":59,"target":55,"value":5},
{"source":59,"target":48,"value":6},
{"source":59,"target":57,"value":2},
{"source":60,"target":48,"value":1},
{"source":60,"target":58,"value":4},
{"source":60,"target":59,"value":2},
{"source":61,"target":48,"value":2},
{"source":61,"target":58,"value":6},
{"source":61,"target":60,"value":2},
{"source":61,"target":59,"value":5},
{"source":61,"target":57,"value":1},
{"source":61,"target":55,"value":1},
{"source":62,"target":55,"value":9},
{"source":62,"target":58,"value":17},
{"source":62,"target":59,"value":13},
{"source":62,"target":48,"value":7},
{"source":62,"target":57,"value":2},
{"source":62,"target":41,"value":1},
{"source":62,"target":61,"value":6},
{"source":62,"target":60,"value":3},
{"source":63,"target":59,"value":5},
{"source":63,"target":48,"value":5},
{"source":63,"target":62,"value":6},
{"source":63,"target":57,"value":2},
{"source":63,"target":58,"value":4},
{"source":63,"target":61,"value":3},
{"source":63,"target":60,"value":2},
{"source":63,"target":55,"value":1},
{"source":64,"target":55,"value":5},
{"source":64,"target":62,"value":12},
{"source":64,"target":48,"value":5},
{"source":64,"target":63,"value":4},
{"source":64,"target":58,"value":10},
{"source":64,"target":61,"value":6},
{"source":64,"target":60,"value":2},
{"source":64,"target":59,"value":9},
{"source":64,"target":57,"value":1},
{"source":64,"target":11,"value":1},
{"source":65,"target":63,"value":5},
{"source":65,"target":64,"value":7},
{"source":65,"target":48,"value":3},
{"source":65,"target":62,"value":5},
{"source":65,"target":58,"value":5},
{"source":65,"target":61,"value":5},
{"source":65,"target":60,"value":2},
{"source":65,"target":59,"value":5},
{"source":65,"target":57,"value":1},
{"source":65,"target":55,"value":2},
{"source":66,"target":64,"value":3},
{"source":66,"target":58,"value":3},
{"source":66,"target":59,"value":1},
{"source":66,"target":62,"value":2},
{"source":66,"target":65,"value":2},
{"source":66,"target":48,"value":1},
{"source":66,"target":63,"value":1},
{"source":66,"target":61,"value":1},
{"source":66,"target":60,"value":1},
{"source":67,"target":57,"value":3},
{"source":68,"target":25,"value":5},
{"source":68,"target":11,"value":1},
{"source":68,"target":24,"value":1},
{"source":68,"target":27,"value":1},
{"source":68,"target":48,"value":1},
{"source":68,"target":41,"value":1},
{"source":69,"target":25,"value":6},
{"source":69,"target":68,"value":6},
{"source":69,"target":11,"value":1},
{"source":69,"target":24,"value":1},
{"source":69,"target":27,"value":2},
{"source":69,"target":48,"value":1},
{"source":69,"target":41,"value":1},
{"source":70,"target":25,"value":4},
{"source":70,"target":69,"value":4},
{"source":70,"target":68,"value":4},
{"source":70,"target":11,"value":1},
{"source":70,"target":24,"value":1},
{"source":70,"target":27,"value":1},
{"source":70,"target":41,"value":1},
{"source":70,"target":58,"value":1},
{"source":71,"target":27,"value":1},
{"source":71,"target":69,"value":2},
{"source":71,"target":68,"value":2},
{"source":71,"target":70,"value":2},
{"source":71,"target":11,"value":1},
{"source":71,"target":48,"value":1},
{"source":71,"target":41,"value":1},
{"source":71,"target":25,"value":1},
{"source":72,"target":26,"value":2},
{"source":72,"target":27,"value":1},
{"source":72,"target":11,"value":1},
{"source":73,"target":48,"value":2},
{"source":74,"target":48,"value":2},
{"source":74,"target":73,"value":3},
{"source":75,"target":69,"value":3},
{"source":75,"target":68,"value":3},
{"source":75,"target":25,"value":3},
{"source":75,"target":48,"value":1},
{"source":75,"target":41,"value":1},
{"source":75,"target":70,"value":1},
{"source":75,"target":71,"value":1},
{"source":76,"target":64,"value":1},
{"source":76,"target":65,"value":1},
{"source":76,"target":66,"value":1},
{"source":76,"target":63,"value":1},
{"source":76,"target":62,"value":1},
{"source":76,"target":48,"value":1},
{"source":76,"target":58,"value":1}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.