| <!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: 12px Microsoft YaHei; pointer-events: none; text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;}.linetext { font-size: 12px Microsoft YaHei;}</style> |
| <body> |
| <script src="https://d3js.org/d3.v3.min.js"></script> |
| <script> |
| |
| var links = |
| [ |
| {source: '猫[猫科猫属动物]', target: '猫', type: 'resolved', 'rela': '中文学名'}, |
| {source: '猫[猫科猫属动物]', target: 'Felinae', type: 'resolved', 'rela': '拉丁学名'}, |
| {source: '猫[猫科猫属动物]', target: '猫咪、家猫、野猫', type: 'resolved', 'rela': '别称'}, |
| {source: '猫[猫科猫属动物]', target: 'Feliscatus', type: 'resolved', 'rela': '二名法'}, |
| {source: '猫[猫科猫属动物]', target: '动物界', type: 'resolved', 'rela': '界'}, |
| {source: '猫[猫科猫属动物]', target: '脊索动物门', type: 'resolved', 'rela': '门'}, |
| {source: '猫[猫科猫属动物]', target: '脊椎动物亚门', type: 'resolved', 'rela': '亚门'}, |
| {source: '猫[猫科猫属动物]', target: '哺乳纲', type: 'resolved', 'rela': '纲'}, |
| {source: '猫[猫科猫属动物]', target: '食肉目', type: 'resolved', 'rela': '目'}, |
| {source: '猫[猫科猫属动物]', target: '猫科', type: 'resolved', 'rela': '科'}, |
| {source: '猫[猫科猫属动物]', target: '猫亚科', type: 'resolved', 'rela': '亚科'}, |
| {source: '猫[猫科猫属动物]', target: '猫属', type: 'resolved', 'rela': '属'}, |
| {source: '猫[猫科猫属动物]', target: '猫种', type: 'resolved', 'rela': '种'}, |
| {source: '猫[猫科猫属动物]', target: '全世界(除南极洲,无野生种)', type: 'resolved', 'rela': '分布区域'}, |
| {source: '猫[猫科猫属动物]', target: 'cat', type: 'resolved', 'rela': '英文名'}, |
| {source: '猫[猫科猫属动物]', target: '猫咪', type: 'resolved', 'rela': '别称'}, |
| {source: '猫[猫科猫属动物]', target: '分布于全世界。', type: 'resolved', 'rela': '分布区域'}, |
| {source: '猫[猫科猫属动物]', target: '猫', type: 'resolved', 'rela': '中文名'}, |
| {source: '猫[猫科猫属动物]', target: 'cat', type: 'resolved', 'rela': '外文名'}, |
| {source: '猫[猫科猫属动物]', target: '猫咪', type: 'resolved', 'rela': '别名'}, |
| {source: '猫[猫科猫属动物]', target: '家猫', type: 'resolved', 'rela': '别名'}, |
| {source: '猫[猫科猫属动物]', target: '野猫', type: 'resolved', 'rela': '别名'}, |
| ]; |
| |
| 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}); |
| }); |
| |
| 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> |
|
|
|
|
|
|
|
|