Reputation: 923
I have a D3 application where I have a structure that shows a relationship between nodes. I need exactly this application for my purpose. But the problem is that the application is using a hardcode json like structure in its html page, which does not fit my purpose.I need to load the json externally from a .json file. Here i have tried to make the json from that hardcodes portion, and also tried to write some code that will load the json externally but it is not working .here is my code..
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.link {
fill: none;
stroke: #666;
stroke-width: 1.5px;
}
#licensing {
fill: green;
}
.link.licensing {
stroke: green;
}
.link.resolved {
stroke-dasharray: 0, 2 1;
}
circle {
fill: #ccc;
stroke: #333;
stroke-width: 1.5px;
}
text {
font: 10px sans-serif;
pointer-events: none;
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
// http://blog.thomsonreuters.com/index.php/mobile-patent-suits-graphic-of-the-day/
/*Here licensing type is making the green arrow
*Here resolved type is making the solid arrow
*Here suit type is making the dotted arrow
*
*
**/
var links = [];
d3.json("directed.json", function(error, json) {
links = json.links.forEach(function(d){
d.source=json.nodes[d.source];
t.target=json.nodes[d.target];
});
});
var nodes = {};
// Compute the distinct nodes from the links.
links.forEach(function(link) {
link.source = nodes[link.source] || (nodes[link.source] = {
name : link.source
});
link.target = nodes[link.target] || (nodes[link.target] = {
name : link.target
});
});
var width = 960, height = 500;
var force = d3.layout.force().nodes(d3.values(nodes)).links(links)
.size([ width, height ]).linkDistance(60).charge(-300).on(
"tick", tick).start();
var svg = d3.select("body").append("svg").attr("width", width).attr(
"height", height);
// Per-type markers, as they don't inherit styles.
svg.append("defs").selectAll("marker").data(
[ "suit", "licensing", "resolved" ]).enter().append("marker")
.attr("id", function(d) {
return d;
}).attr("viewBox", "0 -5 10 10").attr("refX", 15).attr("refY",
-1.5).attr("markerWidth", 6).attr("markerHeight", 6)
.attr("orient", "auto").append("path").attr("d",
"M0,-5L10,0L0,5");
var path = svg.append("g").selectAll("path").data(force.links())
.enter().append("path").attr("class", function(d) {
return "link " + d.type;
}).attr("marker-end", function(d) {
return "url(#" + d.type + ")";
});
var circle = svg.append("g").selectAll("circle").data(force.nodes())
.enter().append("circle").attr("r", 6).call(force.drag);
var text = svg.append("g").selectAll("text").data(force.nodes())
.enter().append("text").attr("x", 8).attr("y", ".31em").text(
function(d) {
return d.name;
});
//selection is happening
var selected = circle.filter(function(d) {
return d.name;
});
selected.each(function(d) {
// d contains the data for the node and this is the circle element
console.log(d.name);
});
var circle = svg.append("g").selectAll("circle").data(force.nodes())
.enter().append("circle").attr("r", 6).on("click", clickfn)
.call(force.drag);
var clickfn = function(node) {
alert(node);
}
// Use elliptical arc path segments to doubly-encode directionality.
function tick() {
path.attr("d", linkArc);
circle.attr("transform", transform);
text.attr("transform", transform);
}
function linkArc(d) {
var dx = d.target.x - d.source.x, dy = d.target.y - d.source.y, dr = Math
.sqrt(dx * dx + dy * dy);
return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr
+ " 0 0,1 " + d.target.x + "," + d.target.y;
}
function transform(d) {
return "translate(" + d.x + "," + d.y + ")";
}
</script>
i have made the json
{
"links" : [ {
"source" : "Microsoft",
"target" : "Amazon",
"type" : "licensing"
}, {
"source" : "Microsoft",
"target" : "HTC",
"type" : "licensing"
}, {
"source" : "Samsung",
"target" : "Apple",
"type" : "suit"
}, {
"source" : "Motorola",
"target" : "Apple",
"type" : "suit"
}, {
"source": "Nokia",
"target": "Apple",
"type" : "resolved"
}, {
"source": "HTC",
"target": "Apple",
"type" : "suit"
}, {
"source" : "Kodak",
"target" : "Apple",
"type" : "suit"
}, {
"source": "Microsoft",
"target": "Barnes & Noble",
"type" :"suit"
}, {
"source": "Microsoft",
"target": "Foxconn",
"type" :"suit"
}, {
"source": "Apple",
"target": "HTC",
"type" :"suit"
}, {
"source" : "Microsoft",
"target" : "Inventec",
"type" : "suit"
}, {
"source" : "Samsung",
"target" : "Kodak",
"type" : "resolved"
}, {
"source" : "LG",
"target" : "Kodak",
"type" : "resolved"
}, {
"source": "RIM",
"target": "Kodak",
"type" :"suit"
}, {
"source" : "Sony",
"target" : "LG",
"type" : "suit"
}, {
"source" : "Kodak",
"target" : "LG",
"type" : "resolved"
}, {
"source" : "Apple",
"target" : "Nokia",
"type" : "resolved"
}, {
"source": "Qualcomm",
"target": "Nokia",
"type" :"resolved"
}, {
"source" : "Kodak",
"target" : "Samsung",
"type" : "resolved"
}, {
"source" : "Apple",
"target" : "Samsung",
"type" : "suit"
}, {
"source": "Kodak",
"target": "RIM",
"type" :"licensing"
}, {
"source": "Kodak",
"target": "Qualcomm",
"type" :"licensing"
} ]
}
and i have modified my code with this
var nodes = {};
d3.json("directed.json", function(error, graph) {
graph.links.forEach(function(d) {
d.source = graph.nodes[d.source];
d.target = graph.nodes[d.target];
});
but nothing is coming to the screen .will anybody help me???
Upvotes: 1
Views: 831
Reputation: 2327
d3.json(
"directed.json",
function(error, directed) {
links=directed.links;
links.forEach(function(link) {
link.source = nodes[link.source]
|| (nodes[link.source] = {
name : link.source
});
link.target = nodes[link.target]
|| (nodes[link.target] = {
name : link.target
});
});
try this this is working for me .....
Upvotes: 2
Reputation: 570
According with your 1st code and the JSON the XHR call must to be
var links = [];
d3.json("directed.json", function(error, json) {
links = json.links;
}).on("load", function () {
// rest of the code here
});
Upvotes: 0