## 昨天找了半天,忘了代码在哪看到的,就不贴原地址了。。
## 直接复制代码然后放到 html 文件中就有演示了
<!DOCTYPE html> <meta charset="utf-8"> <style>.link { fill: none; stroke: #666; stroke-width: 1.5px; } #licensing { fill: green; } .link.licensing { stroke: green; } circle { fill: #ccc; stroke: #333; stroke-width: 1.5px; } text { font: 12px Microsoft YaHei; 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="https://d3js.org/d3.v3.min.js"></script> <script> var links = [ {source: \'艾伦·麦席森·图灵\', target: \'Alan Mathison Turing\', \'rela\': \'外文名\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'英国\', \'rela\': \'国籍\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'英国伦敦\', \'rela\': \'出生地\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'1912年6月23日\', \'rela\': \'出生日期\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'1954年6月7日\', \'rela\': \'逝世日期\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'数学家,逻辑学家,密码学家\', \'rela\': \'职业\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'剑桥大学国王学院,普林斯顿大学\', \'rela\': \'毕业院校\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'“计算机科学之父”\', \'rela\': \'主要成就\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'提出“图灵测试”概念\', \'rela\': \'主要成就\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'人工智能\', \'rela\': \'主要成就\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'破解德国的著名密码系统Enigma\', \'rela\': \'主要成就\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'《论数字计算在决断难题中的应用》\', \'rela\': \'代表作品\', type: \'resolved\'}, {source: \'艾伦·麦席森·图灵\', target: \'《机器能思考吗?》\', \'rela\': \'代表作品\', type: \'resolved\'}, {source: \'人工智能\', target: \'计算\', \'rela\': \'计算1111\', type: \'resolved\'}, {source: \'人工智能\', target: \'想法\', \'rela\': \'想法111\', type: \'resolved\'}, ]; var nodes = {}; 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}); }); console.log(nodes) var width = 1920, height = 1080; var force = d3.layout.force() .nodes(d3.values(nodes)) .links(links) .size([width, height]) .linkDistance(180) .charge(-1500) .on("tick", tick) .start(); var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height); var marker = svg.append("marker") .attr("id", "resolved") .attr("markerUnits", "userSpaceOnUse") .attr("viewBox", "0 -5 10 10") .attr("refX", 32) .attr("refY", -1) .attr("markerWidth", 12) .attr("markerHeight", 12) .attr("orient", "auto") .attr("stroke-width", 2) .append("path") .attr("d", "M0,-5L10,0L0,5") .attr(\'fill\', \'#000000\'); var edges_line = svg.selectAll(".edgepath") .data(force.links()) .enter() .append("path") .attr({ \'d\': function (d) { return \'M \' + d.source.x + \' \' + d.source.y + \' L \' + d.target.x + \' \' + d.target.y }, \'class\': \'edgepath\', \'id\': function (d, i) { return \'edgepath\' + i; } }) .style("stroke", function (d) { var lineColor; lineColor = "#B43232"; return lineColor; }) .style("pointer-events", "none") .style("stroke-width", 0.5) .attr("marker-end", "url(#resolved)"); var edges_text = svg.append("g").selectAll(".edgelabel") .data(force.links()) .enter() .append("text") .style("pointer-events", "none") .attr({ \'class\': \'edgelabel\', \'id\': function (d, i) { return \'edgepath\' + i; }, \'dx\': 80, \'dy\': 0 }); edges_text.append(\'textPath\') .attr(\'xlink:href\', function (d, i) { return \'#edgepath\' + i }) .style("pointer-events", "none") .text(function (d) { return d.rela; }); var circle = svg.append("g").selectAll("circle") .data(force.nodes()) .enter().append("circle") .style("fill", function (node) { var color; var link = links[node.index]; color = "#F9EBF9"; return color; }) .style(\'stroke\', function (node) { var color; var link = links[node.index]; color = "#A254A2"; return color; }) .attr("r", 28) .on("click", function (node) { edges_line.style("stroke-width", function (line) { console.log(line); if (line.source.name == node.name || line.target.name == node.name) { return 4; } else { return 0.5; } }); }) .call(force.drag); var text = svg.append("g").selectAll("text") .data(force.nodes()) .enter() .append("text") .attr("dy", ".35em") .attr("text-anchor", "middle") .style(\'fill\', function (node) { var color; var link = links[node.index]; color = "#A254A2"; return color; }).attr(\'x\', function (d) { var re_en = /[a-zA-Z]+/g; if (d.name.match(re_en)) { d3.select(this).append(\'tspan\') .attr(\'x\', 0) .attr(\'y\', 2) .text(function () { return d.name; }); } else if (d.name.length <= 4) { d3.select(this).append(\'tspan\') .attr(\'x\', 0) .attr(\'y\', 2) .text(function () { return d.name; }); } else { var top = d.name.substring(0, 4); var bot = d.name.substring(4, d.name.length); d3.select(this).text(function () { return \'\'; }); d3.select(this).append(\'tspan\') .attr(\'x\', 0) .attr(\'y\', -7) .text(function () { return top; }); d3.select(this).append(\'tspan\') .attr(\'x\', 0) .attr(\'y\', 10) .text(function () { return bot; }); } }); function tick() { circle.attr("transform", transform1); text.attr("transform", transform2); edges_line.attr(\'d\', function (d) { var path = \'M \' + d.source.x + \' \' + d.source.y + \' L \' + d.target.x + \' \' + d.target.y; return path; }); edges_text.attr(\'transform\', function (d, i) { if (d.target.x < d.source.x) { bbox = this.getBBox(); rx = bbox.x + bbox.width / 2; ry = bbox.y + bbox.height / 2; return \'rotate(180 \' + rx + \' \' + ry + \')\'; } else { return \'rotate(0)\'; } }); } function linkArc(d) { return \'M \' + d.source.x + \' \' + d.source.y + \' L \' + d.target.x + \' \' + d.target.y } function transform1(d) { return "translate(" + d.x + "," + d.y + ")"; } function transform2(d) { return "translate(" + (d.x) + "," + d.y + ")"; } </script>