D3.JS绘制力拓扑图(高亮显示节点+图例显示+缩放+拖拽)

D3.JS绘制力拓扑图(高亮显示节点+图例显示+缩放+拖拽)

注:转载请注明地址https://blog.csdn.net/qq_39360565/article/details/101171379
说明:本文描述所用到的数据是为了方便展示而设计的少量数据,页面显示会比较简陋,可根据自己需要调整布局。json数据格式会在文中展示出来。

1. 效果图(部分)

原始状态不显示线上的文字。
效果图(部分)
当鼠标放在节点上时,会触发监听事件,高亮显示相关节点,并显示相关连线上的文字。(此时鼠标指在点ddd上,高亮显示相关节点)
高亮显示节点和节点上的文字

2.需要的js文件

js文件在d3.js官网上就可以下载

<script type="text/javascript" src="JS/d3.v4.js"></script>
<script type="text/javascript" src="JS/jquery-1.9.1.js"></script>

3.json数据格式

json文件格式(部分):

{
	"nodes": [
    {"id": 1,"name": "a1","group": "你是谁"},
    {"id": 2,"name": "b1","group": "我是谁"}
    ],
    "links": [
    {"source": 1,"target": 2,"type": "m"}
    ]
}

id、name不用解释,主要是group和type这两个属性。
其中group属性是为了区分点的种类,表明该节点是属于哪一类,从而能够区分,主要在统计图例中用到,显示所有节点的种类。
type属性是连线上显示的文字,表示两个点之间的关系。

4.如何高亮显示节点

步骤1:将所有有关系的节点进行标记。(自己写的算法,不打算贴出来)
步骤2:参考以下代码:

var node = vis.selectAll("g.node")
            .data(data.nodes)
            .enter().append("svg:g")
            .attr("class", "node")
            .call(nodeDrag)    //绘图
            //鼠标放在点上触发的事件
            .on('mouseover', function (d) {

                linetext.style("fill-opacity", function (linetext) {
                    if (linetext.source == d || linetext.target == d) {

                        return 1;
                    }
                    if (linetext.source != d && linetext.target != d) {
                        return 0;
                    }
                });
                linetext.text(function (d) {
                    return d.type;
                });

                node.style("opacity",function (nodes) {
                    if(indexArray[d.id][nodes.id]==1||indexArray[nodes.id][d.id]==1){

                        return 1;
                    }
                    else{
                        if(nodes.id == d.id){
                            return 1;
                        }
                        else
                            return 0.1;
                    }
                });

                link.style("opacity", function (link) {
                    if (link.source == d || link.target == d) {
                        return 1;
                    }
                    if (link.source != d && link.target != d) {
                        return 0.1;
                    }
                });
            })
            //单击节点恢复原来的状态
            .on("click",function (d) {
                linetext.style("fill-opacity", 0);
                link.style("opacity", 1);
                node.style("opacity", 1);
            });

就先写到这里吧。。。。。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用D3.js绘制拓扑,可以按以下步骤进行操作: 1. 定义数据结构:拓扑通常由节点和边组成,需要定义节点和边的数据结构。 2. 创建SVG容器:使用D3.js创建SVG容器,设置宽度和高度。 3. 绘制节点:使用D3.js绘制节点,可以根据节点的属性设置节点的大小、形状、颜色等。 4. 绘制边:使用D3.js绘制边,可以根据边的属性设置边的粗细、颜色等。 5. 添加交互:可以为节点和边添加交互效果,例如鼠标悬停、点击等。 以下是一个简单的示例代码: ```javascript // 定义数据结构 var nodes = [{id: 1, name: 'Node 1'}, {id: 2, name: 'Node 2'}, {id: 3, name: 'Node 3'}]; var links = [{source: 1, target: 2}, {source: 2, target: 3}, {source: 3, target: 1}]; // 创建SVG容器 var svg = d3.select('body').append('svg') .attr('width', 400) .attr('height', 400); // 绘制节点 var node = svg.selectAll('.node') .data(nodes) .enter().append('circle') .attr('class', 'node') .attr('r', 20) .attr('cx', function(d) { return Math.random() * 400; }) .attr('cy', function(d) { return Math.random() * 400; }) .style('fill', 'blue'); // 绘制边 var link = svg.selectAll('.link') .data(links) .enter().append('line') .attr('class', 'link') .attr('x1', function(d) { return node.filter(function(n) { return n.id === d.source; }).attr('cx'); }) .attr('y1', function(d) { return node.filter(function(n) { return n.id === d.source; }).attr('cy'); }) .attr('x2', function(d) { return node.filter(function(n) { return n.id === d.target; }).attr('cx'); }) .attr('y2', function(d) { return node.filter(function(n) { return n.id === d.target; }).attr('cy'); }) .style('stroke', 'black') .style('stroke-width', 2); // 添加交互 node.on('mouseover', function() { d3.select(this).style('fill', 'red'); }).on('mouseout', function() { d3.select(this).style('fill', 'blue'); }); ``` 这段代码创建了一个包含3个节点和3条边的拓扑节点和边的位置是随机生成的。运行代码后,可以看到一个简单的拓扑,并且当鼠标悬停在节点上时,节点的颜色会变为红色。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值