Skip to content

Instantly share code, notes, and snippets.

@chemok78
Created February 2, 2017 04:43
Show Gist options
  • Save chemok78/e9be48ff2d64363e398ddf8ef76641e2 to your computer and use it in GitHub Desktop.
Save chemok78/e9be48ff2d64363e398ddf8ef76641e2 to your computer and use it in GitHub Desktop.
Force Directed Graph D3 JS - National Contiguity
var url = "https://raw.githubusercontent.com/DealPete/forceDirected/master/countries.json";
d3.json(url, function(json){
var data = json;
//Set dimensions of div container, SVG and chart area(g element)
var margin = {top: 40, right: 40, bottom: 40, left: 40};
//Width of the visualization area
var w = 1000 - margin.left - margin.right;
var h = 1000 - margin.top - margin.bottom;
//Create SVG element and append to #chart div container
var svg = d3.select("#chart")
.append("svg")
.attr("width", w + margin.left + margin.right)
.attr("height", h + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.attr("id", "area");
//Extract nodes and links data
var nodes = data.nodes;
var links = data.links;
//Get position of g element of the chart
var position = document.getElementById("area").getBoundingClientRect();
//Append tooltip to chart area. Fully transparant at first. Use mouse events to show: making less opaque
var tip = d3.select("#chart").append("div")
.attr("class", "tooltip")
.style("opacity", 0);
//Create a force layout object and define its properties
var force = d3.layout.force()
.size([w,h])
.nodes(nodes)
.links(links);
force.linkDistance(h/20);
//desired distance between connected nodes
//charge influences the linkDistance
force.charge(-120)
//charge is like electrical charge causing the nodes to repel eachother
//to prevent nodes from overlapping eachother
//force.linkStrength(0.5);
//linkStrength influences the linkDistance
//how strong to maintain the linkDistance
//force.gravity(0.2);
//how much the whole visualization is attracted to the edges
//append a link to SVG container for every link data object (no position yet)
var link = svg.selectAll(".link")
.data(links)
.enter()
.append("line")
.attr("class", "link");
//append a node(circle element) to SVG container for every node data object(no position yet)
var node = d3.select("#chart").selectAll(".node")
.data(nodes)
.enter()
.append("div")
.call(force.drag);
force.on("tick", function(){
//set node and link position attributes once force calculations have finished
//position the nodes
//force adds a x and y property to each node object
node.style("left", function(d){
return d.x + position.left + "px";
})
.style("top", function(d){
return d.y + position.top + "px";
})
.attr("class", function(d){
return "flag flag-" + d.code + " node";
})
.attr("src", "https://res.cloudinary.com/dettjqo9j/image/upload/v1485942660/flags_xf9dde.png")
.on("mouseover", function(d){
//show tooltip on mouseover
tip.transition()
.style("opacity", 0.7);
tip.html("<strong>" + d.country + "</strong>")
.style("left", d3.event.pageX + "px")
.style("top", d3.event.pageY - 50 + "px");
})
.on("mouseout", function(d){
tip.transition()
.style("opacity", 0);
});
link.attr("x1", function(d){
//force adds an x and y property to each source and target object of link array
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;
})
})//force.on
force.start();
//let the force start its calculations
});//d3.json
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://fonts.googleapis.com/css?family=Fira+Sans" rel="stylesheet">
</head>
<body>
<div class="container text-center">
<h1>Which Countries Share Borders?</h1>
<h2>A Force-Directed Graph with D3 JS</h2>
<br>
<div id="chart">
</div>
</div>
</body>
body {
margin-top: 20px;
font-family: 'Fira Sans', sans-serif;
background-image: url("https://subtlepatterns.com/patterns/sos.png");
}
svg {
background-color: white;
box-shadow: 0 0 10px #888888;
}
.node {
position: absolute;
}
.link {
stroke: #2c3e50;
stroke-width: 2px;
}
.tooltip {
position: absolute;
text-align: center;
vertical-align: middle;
width: 140px;
height: 50px;
padding: 10px;
font: 14px Fira Sans;
background: #2c3e50;
border: 0px;
border-radius: 8px;
color: white;
}
/*!
* Generated with CSS Flag Sprite generator (https://www.flag-sprites.com/)
*/
.flag {
display: inline-block;
position: absolute;
width: 16px;
height: 11px;
background: url('https://res.cloudinary.com/dettjqo9j/image/upload/v1485942660/flags_xf9dde.png') no-repeat;
}
.flag.flag-ml {
background-position: -224px -88px;
}
.flag.flag-ch {
background-position: -96px -22px;
}
.flag.flag-mx {
background-position: -160px -99px;
}
.flag.flag-gw {
background-position: -144px -55px;
}
.flag.flag-qa {
background-position: -128px -121px;
}
.flag.flag-an {
background-position: -112px 0;
}
.flag.flag-ve {
background-position: -208px -154px;
}
.flag.flag-mg {
background-position: -176px -88px;
}
.flag.flag-hn {
background-position: -208px -55px;
}
.flag.flag-gy {
background-position: -160px -55px;
}
.flag.flag-pn {
background-position: -32px -121px;
}
.flag.flag-ca {
background-position: -16px -22px;
}
.flag.flag-bh {
background-position: -80px -11px;
}
.flag.flag-ge {
background-position: -176px -44px;
}
.flag.flag-pg {
background-position: -208px -110px;
}
.flag.flag-us {
background-position: -128px -154px;
}
.flag.flag-mu {
background-position: -112px -99px;
}
.flag.flag-eh {
background-position: -192px -33px;
}
.flag.flag-ar {
background-position: -144px 0;
}
.flag.flag-bv {
background-position: -208px -11px;
}
.flag.flag-ec {
background-position: -144px -33px;
}
.flag.flag-cy {
background-position: -16px -33px;
}
.flag.flag-eu {
background-position: -16px -44px;
}
.flag.flag-um {
background-position: -112px -154px;
}
.flag.flag-tibet {
background-position: -144px -143px;
}
.flag.flag-fo {
background-position: -96px -44px;
}
.flag.flag-bw {
background-position: -224px -11px;
}
.flag.flag-cn {
background-position: -176px -22px;
}
.flag.flag-se {
background-position: -48px -132px;
}
.flag.flag-mw {
background-position: -144px -99px;
}
.flag.flag-er {
background-position: -224px -33px;
}
.flag.flag-bb {
background-position: 0 -11px;
}
.flag.flag-bn {
background-position: -128px -11px;
}
.flag.flag-at {
background-position: -176px 0;
}
.flag.flag-zm {
background-position: -160px -165px;
}
.flag.flag-pk {
background-position: -240px -110px;
}
.flag.flag-dj {
background-position: -64px -33px;
}
.flag.flag-ke {
background-position: 0 -77px;
}
.flag.flag-pa {
background-position: -160px -110px;
}
.flag.flag-pr {
background-position: -48px -121px;
}
.flag.flag-in {
background-position: -96px -66px;
}
.flag.flag-bt {
background-position: -192px -11px;
}
.flag.flag-gt {
background-position: -112px -55px;
}
.flag.flag-wales {
background-position: -32px -165px;
}
.flag.flag-lr {
background-position: -16px -88px;
}
.flag.flag-pe {
background-position: -176px -110px;
}
.flag.flag-nf {
background-position: 0 -110px;
}
.flag.flag-me {
background-position: -160px -88px;
}
.flag.flag-tj {
background-position: -160px -143px;
}
.flag.flag-al {
background-position: -80px 0;
}
.flag.flag-ae {
background-position: -16px 0;
}
.flag.flag-ga {
background-position: -128px -44px;
}
.flag.flag-il {
background-position: -64px -66px;
}
.flag.flag-td {
background-position: -80px -143px;
}
.flag.flag-no {
background-position: -64px -110px;
}
.flag.flag-lk {
background-position: 0 -88px;
}
.flag.flag-ky {
background-position: -160px -77px;
}
.flag.flag-ai {
background-position: -64px 0;
}
.flag.flag-ps {
background-position: -64px -121px;
}
.flag.flag-aw {
background-position: -208px 0;
}
.flag.flag-cr {
background-position: -208px -22px;
}
.flag.flag-ck {
background-position: -128px -22px;
}
.flag.flag-km {
background-position: -64px -77px;
}
.flag.flag-gs {
background-position: -96px -55px;
}
.flag.flag-mp {
background-position: -32px -99px;
}
.flag.flag-ic {
background-position: -16px -66px;
}
.flag.flag-et {
background-position: 0 -44px;
}
.flag.flag-bm {
background-position: -112px -11px;
}
.flag.flag-lu {
background-position: -64px -88px;
}
.flag.flag-af {
background-position: -32px 0;
}
.flag.flag-tt {
background-position: -16px -154px;
}
.flag.flag-sn {
background-position: -160px -132px;
}
.flag.flag-kh {
background-position: -32px -77px;
}
.flag.flag-mm {
background-position: -240px -88px;
}
.flag.flag-de {
background-position: -48px -33px;
}
.flag.flag-co {
background-position: -192px -22px;
}
.flag.flag-la {
background-position: -192px -77px;
}
.flag.flag-bf {
background-position: -48px -11px;
}
.flag.flag-cw {
background-position: 0 -33px;
}
.flag.flag-dk {
background-position: -80px -33px;
}
.flag.flag-zanzibar {
background-position: -144px -165px;
}
.flag.flag-vc {
background-position: -192px -154px;
}
.flag.flag-uy {
background-position: -144px -154px;
}
.flag.flag-kz {
background-position: -176px -77px;
}
.flag.flag-cz {
background-position: -32px -33px;
}
.flag.flag-sx {
background-position: -16px -143px;
}
.flag.flag-ba {
background-position: -240px 0;
}
.flag.flag-fi {
background-position: -32px -44px;
}
.flag.flag-tm {
background-position: -208px -143px;
}
.flag.flag-sb {
background-position: -240px -121px;
}
.flag.flag-es {
background-position: -240px -33px;
}
.flag.flag-sd {
background-position: -32px -132px;
}
.flag.flag-bj {
background-position: -96px -11px;
}
.flag.flag-bo {
background-position: -144px -11px;
}
.flag.flag-ki {
background-position: -48px -77px;
}
.flag.flag-gi {
background-position: -240px -44px;
}
.flag.flag-pf {
background-position: -192px -110px;
}
.flag.flag-scotland {
background-position: -16px -132px;
}
.flag.flag-tl {
background-position: -192px -143px;
}
.flag.flag-dz {
background-position: -128px -33px;
}
.flag.flag-bz {
background-position: 0 -22px;
}
.flag.flag-tv {
background-position: -32px -154px;
}
.flag.flag-rs {
background-position: -176px -121px;
}
.flag.flag-gu {
background-position: -128px -55px;
}
.flag.flag-lc {
background-position: -224px -77px;
}
.flag.flag-jp {
background-position: -240px -66px;
}
.flag.flag-py {
background-position: -112px -121px;
}
.flag.flag-mv {
background-position: -128px -99px;
}
.flag.flag-re {
background-position: -144px -121px;
}
.flag.flag-md {
background-position: -144px -88px;
}
.flag.flag-kurdistan {
background-position: -128px -77px;
}
.flag.flag-gq {
background-position: -64px -55px;
}
.flag.flag-ss {
background-position: -224px -132px;
}
.flag.flag-cg {
background-position: -80px -22px;
}
.flag.flag-cm {
background-position: -160px -22px;
}
.flag.flag-sh {
background-position: -80px -132px;
}
.flag.flag-ir {
background-position: -144px -66px;
}
.flag.flag-ug {
background-position: -96px -154px;
}
.flag.flag-fr {
background-position: -112px -44px;
}
.flag.flag-gb {
background-position: -144px -44px;
}
.flag.flag-mr {
background-position: -64px -99px;
}
.flag.flag-io {
background-position: -112px -66px;
}
.flag.flag-so {
background-position: -176px -132px;
}
.flag.flag-tw {
background-position: -48px -154px;
}
.flag.flag-ro {
background-position: -160px -121px;
}
.flag.flag-pt {
background-position: -80px -121px;
}
.flag.flag-pm {
background-position: -16px -121px;
}
.flag.flag-ws {
background-position: -64px -165px;
}
.flag.flag-by {
background-position: -240px -11px;
}
.flag.flag-eg {
background-position: -176px -33px;
}
.flag.flag-my {
background-position: -176px -99px;
}
.flag.flag-br {
background-position: -160px -11px;
}
.flag.flag-sz {
background-position: -48px -143px;
}
.flag.flag-mz {
background-position: -192px -99px;
}
.flag.flag-gm {
background-position: -16px -55px;
}
.flag.flag-mn {
background-position: 0 -99px;
}
.flag.flag-cu {
background-position: -224px -22px;
}
.flag.flag-na {
background-position: -208px -99px;
}
.flag.flag-az {
background-position: -224px 0;
}
.flag.flag-sk {
background-position: -112px -132px;
}
.flag.flag-wf {
background-position: -48px -165px;
}
.flag.flag-hu {
background-position: 0 -66px;
}
.flag.flag-nl {
background-position: -48px -110px;
}
.flag.flag-ad {
background-position: 0 0;
}
.flag.flag-jo {
background-position: -224px -66px;
}
.flag.flag-am {
background-position: -96px 0;
}
.flag.flag-tf {
background-position: -96px -143px;
}
.flag.flag-uz {
background-position: -160px -154px;
}
.flag.flag-om {
background-position: -144px -110px;
}
.flag.flag-rw {
background-position: -208px -121px;
}
.flag.flag-sr {
background-position: -208px -132px;
}
.flag.flag-yt {
background-position: -112px -165px;
}
.flag.flag-mc {
background-position: -128px -88px;
}
.flag.flag-kp {
background-position: -96px -77px;
}
.flag.flag-id {
background-position: -32px -66px;
}
.flag.flag-kr {
background-position: -112px -77px;
}
.flag.flag-gd {
background-position: -160px -44px;
}
.flag.flag-tz {
background-position: -64px -154px;
}
.flag.flag-sg {
background-position: -64px -132px;
}
.flag.flag-ao {
background-position: -128px 0;
}
.flag.flag-kg {
background-position: -16px -77px;
}
.flag.flag-somaliland {
background-position: -192px -132px;
}
.flag.flag-fk {
background-position: -64px -44px;
}
.flag.flag-to {
background-position: -240px -143px;
}
.flag.flag-cd {
background-position: -48px -22px;
}
.flag.flag-vg {
background-position: -224px -154px;
}
.flag.flag-bs {
background-position: -176px -11px;
}
.flag.flag-cv {
background-position: -240px -22px;
}
.flag.flag-mo {
background-position: -16px -99px;
}
.flag.flag-nr {
background-position: -96px -110px;
}
.flag.flag-hr {
background-position: -224px -55px;
}
.flag.flag-kn {
background-position: -80px -77px;
}
.flag.flag-tg {
background-position: -112px -143px;
}
.flag.flag-gr {
background-position: -80px -55px;
}
.flag.flag-iq {
background-position: -128px -66px;
}
.flag.flag-bd {
background-position: -16px -11px;
}
.flag.flag-hm {
background-position: -192px -55px;
}
.flag.flag-as {
background-position: -160px 0;
}
.flag.flag-ma {
background-position: -112px -88px;
}
.flag.flag-nz {
background-position: -128px -110px;
}
.flag.flag-ag {
background-position: -48px 0;
}
.flag.flag-fm {
background-position: -80px -44px;
}
.flag.flag-np {
background-position: -80px -110px;
}
.flag.flag-ua {
background-position: -80px -154px;
}
.flag.flag-do {
background-position: -112px -33px;
}
.flag.flag-cl {
background-position: -144px -22px;
}
.flag.flag-au {
background-position: -192px 0;
}
.flag.flag-lb {
background-position: -208px -77px;
}
.flag.flag-kw {
background-position: -144px -77px;
}
.flag.flag-hk {
background-position: -176px -55px;
}
.flag.flag-ly {
background-position: -96px -88px;
}
.flag.flag-ci {
background-position: -112px -22px;
}
.flag.flag-sy {
background-position: -32px -143px;
}
.flag.flag-dm {
background-position: -96px -33px;
}
.flag.flag-mh {
background-position: -192px -88px;
}
.flag.flag-be {
background-position: -32px -11px;
}
.flag.flag-gn {
background-position: -32px -55px;
}
.flag.flag-sl {
background-position: -128px -132px;
}
.flag.flag-bg {
background-position: -64px -11px;
}
.flag.flag-england {
background-position: -208px -33px;
}
.flag.flag-it {
background-position: -176px -66px;
}
.flag.flag-va {
background-position: -176px -154px;
}
.flag.flag-pl {
background-position: 0 -121px;
}
.flag.flag-gl {
background-position: 0 -55px;
}
.flag.flag-ee {
background-position: -160px -33px;
}
.flag.flag-ms {
background-position: -80px -99px;
}
.flag.flag-jm {
background-position: -208px -66px;
}
.flag.flag-je {
background-position: -192px -66px;
}
.flag.flag-ye {
background-position: -96px -165px;
}
.flag.flag-catalonia {
background-position: -32px -22px;
}
.flag.flag-nc {
background-position: -224px -99px;
}
.flag.flag-ru {
background-position: -192px -121px;
}
.flag.flag-gg {
background-position: -208px -44px;
}
.flag.flag-lv {
background-position: -80px -88px;
}
.flag.flag-gp {
background-position: -48px -55px;
}
.flag.flag-fj {
background-position: -48px -44px;
}
.flag.flag-mk {
background-position: -208px -88px;
}
.flag.flag-ph {
background-position: -224px -110px;
}
.flag.flag-tk {
background-position: -176px -143px;
}
.flag.flag-gh {
background-position: -224px -44px;
}
.flag.flag-mq {
background-position: -48px -99px;
}
.flag.flag-ne {
background-position: -240px -99px;
}
.flag.flag-vu {
background-position: -16px -165px;
}
.flag.flag-sm {
background-position: -144px -132px;
}
.flag.flag-st {
background-position: -240px -132px;
}
.flag.flag-vn {
background-position: 0 -165px;
}
.flag.flag-is {
background-position: -160px -66px;
}
.flag.flag-cf {
background-position: -64px -22px;
}
.flag.flag-im {
background-position: -80px -66px;
}
.flag.flag-zw {
background-position: -176px -165px;
}
.flag.flag-ht {
background-position: -240px -55px;
}
.flag.flag-sv {
background-position: 0 -143px;
}
.flag.flag-tc {
background-position: -64px -143px;
}
.flag.flag-ni {
background-position: -32px -110px;
}
.flag.flag-mt {
background-position: -96px -99px;
}
.flag.flag-tn {
background-position: -224px -143px;
}
.flag.flag-lt {
background-position: -48px -88px;
}
.flag.flag-sa {
background-position: -224px -121px;
}
.flag.flag-th {
background-position: -128px -143px;
}
.flag.flag-si {
background-position: -96px -132px;
}
.flag.flag-tr {
background-position: 0 -154px;
}
.flag.flag-nu {
background-position: -112px -110px;
}
.flag.flag-xk {
background-position: -80px -165px;
}
.flag.flag-ng {
background-position: -16px -110px;
}
.flag.flag-ls {
background-position: -32px -88px;
}
.flag.flag-za {
background-position: -128px -165px;
}
.flag.flag-sc {
background-position: 0 -132px;
}
.flag.flag-li {
background-position: -240px -77px;
}
.flag.flag-ie {
background-position: -48px -66px;
}
.flag.flag-pw {
background-position: -96px -121px;
}
.flag.flag-gf {
background-position: -192px -44px;
}
.flag.flag-vi {
background-position: -240px -154px;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment