| | <!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> |
| |
|
| |
|
| |
|
| |
|