力导向图知识图谱可视化(节点可点击)

来源:互联网 发布:成都市文化馆网络报名 编辑:程序博客网 时间:2024/06/03 21:24

用d3.js的力导向图写了一个知识图谱可视化的demo,节点可点击着实费了我不少功夫,如果小伙伴有更简单的方法还求留言呢~

由于数据市实验室的某项目,不太好直接贴出来,反正这样的格式就好:反正是给大家参考的~

{ name: "name", type: 0    }

<!DOCTYPE html><html><head>    <meta charset="utf-8">    <title>专题服务</title>    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>    <style type="text/css">    </style></head><body><div id="main" name="main">    <div id="image"></div></div><script>    var nodes = [这里是数据];    var edges = [  { source : 0  , target: 1, rel:1 } , { source : 0  , target: 2 , rel:1} ,        { source : 0  , target: 3, rel:1 } , { source : 0  , target: 4 , rel:1} ,        { source : 0  , target: 5, rel:1 } , { source : 0  , target: 6 , rel:1},        { source : 0  , target: 7, rel:1 } , { source : 0  , target: 8, rel:1 },        { source : 0  , target: 9, rel:1 } , { source : 0  , target: 10, rel:1 },        { source : 0  , target: 11, rel:1 } , { source : 0  , target: 12 , rel:1},        {source: 2, target: 13, rel:2}, {source: 2, target: 14, rel:2},        {source: 2, target: 15, rel:2}, {source: 2, target: 16, rel:2},        {source: 2, target: 17, rel:2}, {source: 14, target: 18, rel:3},        {source: 14, target: 19, rel:3}, {source: 14, target: 20, rel:3},        {source: 15, target: 21, rel:4}, {source: 15, target: 22, rel:4},        {source: 13, target: 23, rel:5}, {source: 13, target: 24, rel:5},        {source: 13, target: 25, rel:5}, {source: 13, target: 26, rel:5},        {source: 13, target: 27, rel:5},{source: 16, target: 28, rel:6}, {source: 16, target: 29, rel:6},        {source: 16, target: 30, rel:6}, {source: 16, target: 31, rel:6},        {source: 16, target: 32, rel:6},{source: 17, target: 33, rel:7}, {source: 17, target: 34, rel:7},        {source: 17, target: 35, rel:7}    ];    var width = 1000;    var height = 800;    var svg = d3.select("body")        .append("svg")        .attr("width",width)        .attr("height",height);    var force = d3.layout.force()        .nodes(nodes)//指定节点数组        .links(edges)//指定连线数组        .size([width-20,height-20])//指定范围        .charge(-300)        .theta(0.2)        .linkDistance(function(d, i){            //console.log(d);            if(edges[i].rel==1){                return 180;            }else if(edges[i].rel==2){                return 150;            }else{                return 100;            }        })        .charge(-400);//相互之间的作用力    force.start();//开始作用    //console.log(nodes);    //console.log(edges);    //添加连线    var svg_edges = svg.selectAll("line")        .data(edges)        .enter()        .append("line")        .style("stroke","#ccc")        .style("stroke-width",1)        .attr("opacity", function(d,i){            if(edges[i].rel=="1"){                return 1.0;            }else{                return 0.0;            }        });    //添加节点    var svg_nodes = svg.selectAll("circle")        .data(nodes)        .enter()        .append("circle")        .attr("r",20)        .style("fill", function (d,i){if(nodes[i].type=="0"){            return "#B2A4DA";        }else if(nodes[i].type=="1"){            return "#6EB0EA";        }else if(nodes[i].type=="2"){            return "#90E4EA";        }else{            return "#A8EAA7"        }        })        .attr("opacity", function(d,i){            if(nodes[i].type=="1"||nodes[i].type=="0"){                return 1.0;            }else{                return 0.0;            }        })        .call(force.drag)        .on("click", function(d,i){            //围产医学            if(nodes[i].name=="围产医学") {                svg.selectAll("circle")                    .attr("opacity",function(d,i){                        if(nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("text")                    .attr("opacity", function(d,i){                    if(nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                        return 1.0;                    }else{                        return 0;                    }                });                svg.selectAll("line").attr("opacity", function(d,i){                    if(edges[i].rel=="2"||edges[i].rel=="1"){                        return 1.0;                    }else{                        return 0;                    }                });            }            //母婴传播            else if(nodes[i].name=="母婴传播") {                svg.selectAll("circle")                    .attr("opacity",function(d,i){                        if(nodes[i].type=="3"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("text")                    .attr("opacity", function(d,i){                        if(nodes[i].type=="3"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("line").attr("opacity", function(d,i){                    if(edges[i].rel=="3"||edges[i].rel=="2"||edges[i].rel=="1"){                        return 1.0;                    }else{                        return 0;                    }                });            }            //生殖遗传            else if(nodes[i].name=="生殖遗传") {                svg.selectAll("circle")                    .attr("opacity",function(d,i){                        if(nodes[i].type=="4"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("text")                    .attr("opacity", function(d,i){                        if(nodes[i].type=="4"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("line").attr("opacity", function(d,i){                    if(edges[i].rel=="4"||edges[i].rel=="2"||edges[i].rel=="1"){                        return 1.0;                    }else{                        return 0;                    }                });            }            //慢性疾病与生育风险            else if(nodes[i].name=="慢性疾病与生育风险") {                svg.selectAll("circle")                    .attr("opacity",function(d,i){                        if(nodes[i].type=="5"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("text")                    .attr("opacity", function(d,i){                        if(nodes[i].type=="5"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("line").attr("opacity", function(d,i){                    if(edges[i].rel=="5"||edges[i].rel=="2"||edges[i].rel=="1"){                        return 1.0;                    }else{                        return 0;                    }                });            }            //妊娠期疾病            else if(nodes[i].name=="妊娠期疾病") {                svg.selectAll("circle")                    .attr("opacity",function(d,i){                        if(nodes[i].type=="6"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("text")                    .attr("opacity", function(d,i){                        if(nodes[i].type=="6"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("line").attr("opacity", function(d,i){                    if(edges[i].rel=="6"||edges[i].rel=="2"||edges[i].rel=="1"){                        return 1.0;                    }else{                        return 0;                    }                });            }            //妊娠结局            else if(nodes[i].name=="妊娠结局") {                svg.selectAll("circle")                    .attr("opacity",function(d,i){                        if(nodes[i].type=="7"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("text")                    .attr("opacity", function(d,i){                        if(nodes[i].type=="7"||nodes[i].type=="2"||nodes[i].type=="1"||nodes[i].type=="0"){                            return 1.0;                        }else{                            return 0;                        }                    });                svg.selectAll("line").attr("opacity", function(d,i){                    if(edges[i].rel=="7"||edges[i].rel=="2"||edges[i].rel=="1"){                        return 1.0;                    }else{                        return 0;                    }                });            }        });//使得节点能够拖动    //添加描述节点的文字    var svg_texts = svg.selectAll("text")        .data(nodes)        .enter()        .append("text")        .style("fill", "black")        .attr("dx", -50)        .attr("dy", 30)        .attr("font-size", 12)        .attr("opacity", function(d,i){            if(nodes[i].type=="1"){                return 1.0;            }else{                return 0.0;            }        })        .text(function(d){            return d.name;        });    force.on("tick", function(){//对于每一个时间间隔        //更新连线坐标        svg_edges.attr("x1",function(d){ 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; });        //更新节点坐标        svg_nodes.attr("cx",function(d){ return d.x; })            .attr("cy",function(d){ return d.y; });        //更新文字坐标        svg_texts.attr("x", function(d){ return d.x; })            .attr("y", function(d){ return d.y; });    });</script></body></html>



阅读全文
0 0
原创粉丝点击