d3.js——用力学图表示人物关系

relation.json:

{
  "nodes":[
    { "name": "云天河"   , "image" : "SilenceImage/tianhe.jpg" },
    { "name": "韩菱纱"   , "image" : "SilenceImage/lingsha.jpg" },
    { "name": "柳梦璃"   , "image" : "SilenceImage/mengli.jpg" },
    { "name": "慕容紫英" , "image" : "SilenceImage/ziying.jpg" }
  ],
  "edges":[
    { "source": 0 , "target": 1 , "relation":"挚友" },
    { "source": 0 , "target": 2 , "relation":"挚友" },
    { "source": 0 , "target": 3 , "relation":"挚友" }
  ]
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>力学图加人物关系图</title>
</head>
<style>
    .nodetext {
        font-size: 12px ;
        font-family: SimSun;
        fill: #ff3451;
    }
    .linetext {
        font-size: 12px ;
        font-family: SimSun;
        fill: #64ffae;
        fill-opacity:1.0;
    }
</style>
<body>
<script src="d3.js"></script>
<script src="js/relation.js"></script>
</body>
</html>

var width = 600,
    height = 600;
var img_w = 77,
    img_h = 90;
var svg  = d3.select("body").append("svg")
    .attr("width",width)
    .attr("height",height)

d3.json("relation.json",function(error,root){
    if (error)  {return console.log(error)}
    console.log(root);
    //定义力学图的布局
    var force = d3.layout.force()
        .nodes(root.nodes)
        .links(root.edges)
        .size([width,height])
        .linkDistance(200)
        .charge(-1500)
        .start();
    //绘制连接线
    var edges_line = svg.selectAll("line")
        .data(root.edges)
        .enter()
        .append("line")
        .style("stroke","#ccc")
        .style("stroke_width",1)
    var edges_text = svg.selectAll(".linetext")
        .data(root.edges)
        .enter()
        .append("text")
        .attr("class","linetext")
        .text(function(d){return d.relation;})
    //绘制结点
    var node_img = svg.selectAll("image")
        .data(root.nodes)
        .enter()
        .append("image")
        .attr("width",img_w)
        .attr("height",img_h)
        .attr("xlink:href",function(d){return d.image})
        .on("dblclick",function(d,i){
            d.fixed = false;
        })
        .call(force.drag)

    var node_dx = -20,
        node_dy = 20;
    var node_text = svg.selectAll(".nodetext")
        .data(root.nodes)
        .enter()
        .append("text")
        .attr("class","nodetext")
        .attr("dx",node_dx)
        .attr("dy",node_dy)
        .text(function(d){return d.name})
    //运动刷新
    force.on("tick",function(){
        //限制结点的边界
        root.nodes.forEach(function (d,i) {
            d.x = d.x-img_w/2<0?img_w: d.x;
            d.x = d.x+img_w/2>width?width-img_w/2: d.x;
            d.y = d.y - img_h/2<0?img_h/2: d.y;
            d.y = d.y +img_h/2>height?height-img_h/2: d.y;
        })
        //刷新连接线的位置
        edges_line.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;})
        //刷新连接线上的文字位置
        edges_text.attr("x",function(d){return (d.source.x+ d.target.x)/2;})
            .attr("y",function(d){return (d.source.y + d.target.y)/2;});
        //刷新结点图片位置
        node_img.attr("x",function(d){return d.x-img_w/2;})
            .attr("y",function(d){return d.y-img_h/2})
        //刷新结点图片位置
        node_text.attr("x",function(d){return d.x})
            .attr("y",function(d){return d.y+img_w/2})

    })
//拖拽开始后设定被拖拽对象为固定
    var drag  = force.drag()
        .on("dragstart", function (d) {
            d.fixed = true;
        })
})


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值