根据json中的坐标定位节点

如何解决根据json中的坐标定位节点

我试图让有向网络的节点看起来位于页面启动时json文档中反映的坐标处。但是,实际代码重新计算了节点位置,不符合我的应用程序的要求。有什么帮助吗?

主要代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <style type="text/css">
    .node {}

    .link { 
        stroke: #999; 
        stroke-opacity: .6; 
        stroke-width: 1px; 
        }
    line {
        stroke: rgb(212,212,212);
        stroke-width: 1px;
        shape-rendering: crispEdges; 
        }
    svg { 
        box-sizing: border-box;
        border: 1px solid rgb(212,212);
        }
    </style>
    </head>
    <body>
    <svg width="960" height="600"></svg>

    <script src="https://d3js.org/d3.v4.min.js" type="text/javascript"></script>
    <script src="https://d3js.org/d3-selection-multi.v1.js"></script>

    <script type="text/javascript">

    var width = 960,height = 500,resolution = 150,r = 15;

    var colors = d3.scaleOrdinal(d3.schemeCategory10);

    var svg = d3.select("svg"),width = +svg.attr("width"),height = +svg.attr("height"),node,link;

    svg.selectAll('.vertical')
    .data(d3.range(1,width / resolution))
    .enter().append('line')
    .attr('class','vertical')
    .attr('x1',function(d) { return d * resolution; })
    .attr('y1',0)
    .attr('x2',function(d) { return d * resolution; })
    .attr('y2',height);

    svg.selectAll('.horizontal')
    .data(d3.range(1,height / resolution))
    .enter().append('line')
    .attr('class','horizontal')
    .attr('x1',0)
    .attr('y1',function(d) { return d * resolution; })
     .attr('x2',width)
    .attr('y2',function(d) { return d * resolution; });

    svg.append('defs').append('marker')
    .attrs({'id':'arrowhead','viewBox':'-0 -5 10 10','refX':13,'refY':0,'orient':'auto','markerWidth':13,'markerHeight':13,'xoverflow':'visible'})
    .append('svg:path')
    .attr('d','M 0,-5 L 10,0 L 0,5')
    .attr('fill','#999')
    .style('stroke','none');

    var simulation = d3.forceSimulation()
    .force("link",d3.forceLink().id(function (d) {return d.id;}).distance(150).strength(1))
    //.force("charge",d3.forceManyBody())
    //.force("center",d3.forceCenter(width / 2,height / 2));

    d3.json("graph.json",function (error,graph) {
    if (error) throw error;
    update(graph.links,graph.nodes);
    })

    function update(links,nodes) {
    link = svg.selectAll(".link")
        .data(links)
        .enter()
        .append("line")
        .attr("class","link")
        .attr('marker-end','url(#arrowhead)')

    link.append("title")
        .text(function (d) {return d.type;});

    edgepaths = svg.selectAll(".edgepath")
        .data(links)
        .enter()
        .append('path')
        .attrs({
            'class': 'edgepath','fill-opacity': 0,'stroke-opacity': 0,'id': function (d,i) {return 'edgepath' + d.type}
        })
        .style("pointer-events","none");

    edgelabels = svg.selectAll(".edgelabel")
        .data(links)
        .enter()
        .append('text')
        .style("pointer-events","none")
        .attrs({
            'class': 'edgelabel',i) {return 'edgelabel' + i},'font-size': 15,'fill': '#000'
        });

    edgelabels.append('textPath')
        .attr('xlink:href',function (d,i) {return '#edgepath' + i})
        .style("text-anchor","middle")
        .style("pointer-events","none")
        .attr("startOffset","50%")
        .text(function (d) {return d.type});

    node = svg.selectAll(".node")
        .data(nodes)
        .enter()
        .append("g")
        .attr("class","node")
        .attr('cx',function(d) { return d.x; })
        .attr('cy',function(d) { return d.y; })
        .call(d3.drag()
                .on("start",dragstarted)
                .on("drag",dragged)
                //.on("end",dragended)
        );

    node.append("circle")
        .attr("r",15)
        .style("fill",i) {return colors(i);})

    node.append("title")
        .text(function (d) {return d.social;});

    node.append("text")
        .attr("dy",-3)
        .text(function (d) {return d.name+":"+d.social;});

    simulation
        .nodes(nodes)
        .on("tick",ticked);

    simulation.force("link")
        .links(links);
    }

    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("transform",function (d) {return "translate(" + d.x + "," + d.y + ")";});

    edgepaths.attr('d',function (d) {
        return 'M ' + d.source.x + ' ' + d.source.y + ' L ' + d.target.x + ' ' + d.target.y;
    });
    }

    function dragstarted(d) {
    if (!d3.event.active) simulation.alphaTarget(1.0).restart()
    d.fx = d.x;
    d.fy = d.y;
    }

    function dragged(d) {
    d.fx = d3.event.x;
    d.fy = d3.event.y;

    gridX = round(Math.max(r,Math.min(width - r,d.fx)),resolution);
    gridY = round(Math.max(r,Math.min(height - r,d.fy)),resolution);

    d3.select(this).attr('cx',d.fx = gridX).attr('cy',d.fy = gridY);


    }

    function round(p,n) {
    return p % n < n / 2 ? p - (p % n) : p + n - (p % n);
    }

    </script>

    </body>
    </html>

这里我附上承载定向的json文档的数据 图数据:

    {
     "nodes": [
    {
      "name": "1","label": "1","social": "I","id": 1,"x": 150,"y": 450
    },{
      "name": "2","label": "2","social": "G","x": 300,"y": 150
    },{
      "name": "3","label": "3","social": "T","x": 450,"y": 300
    }
    ],"links": [
    {
      "source": 1,"target": 2,"type": "N:1"
    },{
      "source": 2,"target": 3,"type": "1:N"
    }
    ]
    }

解决方法

此代码不起作用:

node = svg.selectAll(".node")
  .data(nodes)
  .enter()
  .append("g")
  .attr("class","node")
  .attr('cx',function(d) { return d.x; })
  .attr('cy',function(d) { return d.y; })
  ...

替换为:

node = svg.selectAll(".node")
  .data(nodes)
  .enter()
  .append('g')
  .classed('node',true)
  .attr('transform',d => `translate(${d.x},${d.y})`)
  ...

元素没有 cxcy 属性,而是使用变换。此外,d3 classed 例程比 attr('class') 更有用。

UPD:新创建的链接缺少初始坐标:

link = svg.selectAll(".link")
  .data(links)
  .enter()
  .append("line")
  .classed("link",true)
  .attr('marker-end','url(#arrowhead)')
  .attr("x1",d => d.source.x)
  .attr("x2",d => d.target.x)
  .attr("y1",d => d.source.y)
  .attr("y1",d => d.target.y)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res