D3强制拉力/避免节点重叠力碰撞,半径

如何解决D3强制拉力/避免节点重叠力碰撞,半径

我试图通过使用d3强制布局来创建群集气泡。 在参考了几个代码之后,我可以创建以下图表。 但是,问题在于圆圈彼此重叠。 我提到了这个问题的几个问答,但仍然无法解决问题。

我试图制作类似以下网站的图表。(https://blockbuilder.org/ericsoco/d2d49d95d2f75552ac64f0125440b35e) 我已经添加了forcecollide,但是它似乎不起作用。

有人可以帮助解决这个问题吗?

enter image description here

此图表的代码如下。

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <div id="my_dataviz"></div>
    <script src="https://d3js.org/d3.v5.js"></script>
    <script>

// set the dimensions and margins of the graph
var width = 450
var height = 450

// append the svg object to the body of the page
var svg = d3.select("#my_dataviz")
  .append("svg")
    .attr("width",450)
    .attr("height",450),color = d3.scaleOrdinal(d3.schemeAccent);

// create dummy data -> just one element per circle
var data = [{ "name": "A",value:10},{ "name": "B",value:20 },{ "name": "C",{ "name": "D",value:60 },{ "name": "E",{ "name": "F",value:20  },{ "name": "G",value:50  },{ "name": "H",value:100 }]

// Initialize the circle: all located at the center of the svg area
var node = svg.append("g")
  .selectAll("circle")
  .data(data)
  .enter()
  .append("circle")
    .attr("r",d => d.value)
    .attr("cx",width / 2)
    .attr("cy",height / 2)
    .style("fill",d=>color(d.name))
    .style("fill-opacity",0.9)
    // .attr("stroke","#b3a2c8")
    .style("stroke-width",4)
    .call(d3.drag() // call specific function when circle is dragged
         .on("start",dragstarted)
         .on("drag",dragged)
         .on("end",dragended));

 var transitionTime = 3000;
 var t = d3.timer(function (elapsed) {
   var dt = elapsed / transitionTime;
   simulation.force('collide').strength(Math.pow(dt,2) * 0.7);
   if (dt >= 1.0) t.stop();
 });




// Features of the forces applied to the nodes:
var simulation = d3.forceSimulation()
    .force("center",d3.forceCenter().x(width / 2).y(height / 2)) // Attraction to the center of the svg area
    .force("collide",d3.forceCollide().strength(1).radius(30).iterations(1)) // Force that avoids circle overlapping
    .force('attract',d3.forceRadial(0,width / 2,height / 2).strength(0.07))



// Apply these forces to the nodes and update their positions.
// Once the force algorithm is happy with positions ('alpha' value is low enough),simulations will stop.
simulation
    .nodes(data)
    .on("tick",function(d){
      node
          .attr("cx",function(d){ return d.x; })
          .attr("cy",function(d){ return d.y; })
    });

// What happens when a circle is dragged?
function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(.03).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(.03);
  d.fx = null;
  d.fy = null;
}

</script>

  </body>
</html>

解决方法

collide中,30的常量为radius,如果传递回调函数以返回节点值(您的节点半径),则问题应解决了。这是我的操作方式:

.force("collide",d3.forceCollide().strength(1).radius( (d) => d.value  ).iterations(1))

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

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地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-