Created
February 2, 2017 04:43
-
-
Save chemok78/e9be48ff2d64363e398ddf8ef76641e2 to your computer and use it in GitHub Desktop.
Force Directed Graph D3 JS - National Contiguity
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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