d3力导向图

d3力导向图
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    <script type="text/javascript" src="../d3.js"></script>-->
    <script src = "https://d3js.org/d3.v4.min.js"></script>
</head>
<body>
<style>
    svg{
        background-color: #ccc;
    }
</style>
<script>
    let dataset={
        nodes: [
            { name: "Adam" },
            { name: "Bob" },
            { name: "Carrie" },
            { name: "Donovan" },
            { name: "Edward" },
            { name: "Felicity" },
            { name: "George" },
            { name: "Hannah" },
            { name: "Iris" },
            { name: "Jerry" }
        ],
        edges: [
            { source: 0, target: 1 },
            { source: 0, target: 2 },
            { source: 0, target: 3 },
            { source: 0, target: 4 },
            { source: 1, target: 5 },
            { source: 2, target: 5 },
            { source: 2, target: 5 },
            { source: 3, target: 4 },
            { source: 5, target: 8 },
            { source: 5, target: 9 },
            { source: 6, target: 7 },
            { source: 7, target: 8 },
            { source: 8, target: 9 }
        ]
    }
    let width=800
    let height=500

    let svg=d3.select('body').append('svg').attr('width',width).attr('height',height)

    let force=d3.forceSimulation(dataset.nodes)
                .force('charge',d3.forceManyBody())
                .force('link',d3.forceLink(dataset.edges))
                .force('center',d3.forceCenter().x(width/2).y(height/2))

    let color=d3.scaleOrdinal(d3.schemeCategory10)

    let edges=svg.selectAll('line')
                .data(dataset.edges)
                .enter()
                .append('line')
                .style('stroke','red')
                .style('stroke-width',1)

    let nodes=svg.selectAll('.node')
                .data(dataset.nodes)
                .enter()
                .append('g')
                .call(d3.drag()
                .on('start',dragStarted)
                .on('drag',dragging)
                .on('end',dragEnded)
                )

    nodes.append('circle')
        .attr('r',15)
        .style('fill',function (d,i){
            return color(i)
        })

    nodes.append("text")
        // 文字内容
        .text(function (d) {
            return d.name;
        })
        .attr("font-family", "sans-serif")
        .attr("font-size", "11px")
        .attr("fill", "red");

    force.on('tick',function (){
        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})
        // nodes.attr('cx',function (d){return d.x})
        //     .attr('cy',function (d){return d.y})
        d3.selectAll("circle")
            .attr("cx", function (d) {
                return d.x;
            })
            .attr("cy", function (d) {
                return d.y;
            });
        d3.selectAll("text")
            .attr("x", function (d) {
                return d.x;
            })
            .attr("y", function (d) {
                return d.y;
            });
    })

    function dragStarted(d){
        if(!d3.event.active) force.alphaTarget(0.3).restart()
        d.fx=d.x
        d.fy=d.y
    }
    function dragging(d) {
        d.fx = d3.event.x;
        d.fy = d3.event.y;
    }

    function dragEnded(d) {
        if (!d3.event.active) force.alphaTarget(0);
        d.fx = null;
        d.fy = null;
    }
</script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的d3导向的代码示例,包含了节点、边和节点拖动等功能: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>导向</title> <script src="https://d3js.org/d3.v5.min.js"></script> </head> <body> <svg width="600" height="600"></svg> <script> // 创建节点和边的数据 var nodes = [{id: 'A'}, {id: 'B'}, {id: 'C'}, {id: 'D'}, {id: 'E'}]; var links = [{source: 'A', target: 'B'}, {source: 'B', target: 'C'}, {source: 'C', target: 'D'}, {source: 'D', target: 'E'}, {source: 'E', target: 'A'}]; // 创建导向模拟器 var simulation = d3.forceSimulation(nodes) .force('link', d3.forceLink(links).id(function(d) { return d.id; })) .force('charge', d3.forceManyBody()) .force('center', d3.forceCenter(300, 300)) .on('tick', ticked); // 创建节点和边的SVG元素 var svg = d3.select('svg'); var link = svg.selectAll('line') .data(links) .enter().append('line') .attr('stroke', '#999') .attr('stroke-width', '1'); var node = svg.selectAll('circle') .data(nodes) .enter().append('circle') .attr('r', 10) .attr('fill', '#ccc') .call(d3.drag() .on('start', dragstarted) .on('drag', dragged) .on('end', dragended)); // 节点拖动相关的函数 function dragstarted(d) { if (!d3.event.active) simulation.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; } function dragged(d) { d.fx = d3.event.x; d.fy = d3.event.y; } function dragended(d) { if (!d3.event.active) simulation.alphaTarget(0); d.fx = null; d.fy = null; } // 每个时间段更新节点和边的位置 function ticked() { link.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; }); node.attr('cx', function(d) { return d.x; }) .attr('cy', function(d) { return d.y; }); } </script> </body> </html> ``` 在这个示例中,我们首先创建了节点和边的数据,并使用 `d3.forceSimulation()` 函数创建了导向模拟器。然后,我们创建了节点和边的SVG元素,并使用 `d3.drag()` 函数为节点添加了拖动事件。最后,在模拟器的每个时间段里,我们更新了节点和边的位置。如果你需要更详细的解释,请参考d3官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值