D3 带边界框的力定向布局

2023-12-11

我是 D3 新手,在设置力导向布局的边界时遇到困难。我已经设法(从示例中)拼凑出我想要的内容,但我需要包含图表。在刻度函数中,变换/翻译将正确显示我的图形,但是当我将 cx 和 cy 与 Math.max/min 一起使用时(请参阅注释代码),节点被固定到 左上角,同时线条正确包含。

以下是我的内容...我做错了什么?

var w=960, h=500, r=8,  z = d3.scale.category20();

var color = d3.scale.category20();

var force = d3.layout.force()
       .linkDistance( function(d) { return (d.value*180) } )
       .linkStrength( function(d) { return (1/(1+d.value)) } )
       .charge(-1000)
       //.gravity(.08)
       .size([w, h]);

var vis = d3.select("#chart").append("svg:svg")
       .attr("width", w)
       .attr("height", h)
       .append("svg:g")
       .attr("transform", "translate(" + w / 4 + "," + h / 3 + ")");

vis.append("svg:rect")
   .attr("width", w)
   .attr("height", h)
   .style("stroke", "#000");


d3.json("miserables.json", function(json) {

       var link = vis.selectAll("line.link")
               .data(json.links);

       link.enter().append("svg:line")
               .attr("class", "link")
               .attr("x1", function(d) { return d.source.x; })
               .attr("y1", function(d) { return d.source.y; })
               .attr("x2", function(d) { return d.source.x; })
               .attr("y2", function(d) { return d.source.y; })
               .style("stroke-width", function(d) { return (1/(1+d.value))*5 });

       var node = vis.selectAll("g.node")
               .data(json.nodes);

       var nodeEnter = node.enter().append("svg:g")
               .attr("class", "node")
               .on("mouseover", fade(.1))
               .on("mouseout", fade(1))
               .call(force.drag);

       nodeEnter.append("svg:circle")
               .attr("r", r)
               .style("fill", function(d) { return z(d.group); })
               .style("stroke", function(d) { return
d3.rgb(z(d.group)).darker(); });

       nodeEnter.append("svg:text")
               .attr("text-anchor", "middle")
               .attr("dy", ".35em")
               .text(function(d) { return d.name; });

       force
       .nodes(json.nodes)
       .links(json.links)
       .on("tick", tick)
       .start();

       function tick() {

       // This works
               node.attr("transform", function(d) { return "translate(" + d.x + ","
+ d.y + ")"; });

       // This contains the lines within the boundary, but the nodes are
stuck in the top left corner
               //node.attr("cx", function(d) { return d.x = Math.max(r, Math.min(w
- r, d.x)); })
               //      .attr("cy", function(d) { return d.y = Math.max(r, Math.min(h -
r, d.y)); });

       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; });
       }

       var linkedByIndex = {};

   json.links.forEach(function(d) {
       linkedByIndex[d.source.index + "," + d.target.index] = 1;
   });

       function isConnected(a, b) {
       return linkedByIndex[a.index + "," + b.index] ||
linkedByIndex[b.index + "," + a.index] || a.index == b.index;
   }

       function fade(opacity) {
       return function(d) {
           node.style("stroke-opacity", function(o) {
                       thisOpacity = isConnected(d, o) ? 1 : opacity;
                       this.setAttribute('fill-opacity', thisOpacity);
               return thisOpacity;
                       });

                       link.style("stroke-opacity", opacity).style("stroke-opacity",
function(o) {
               return o.source === d || o.target === d ? 1 : opacity;
               });
       };
       }

});

有一个边界框示例 in my 谈论部队布局。位置 Verlet 集成允许您定义几何约束(例如边界框和碰撞检测) 在“tick”事件监听器内;只需移动节点以符合约束,模拟就会相应地进行调整。

也就是说,重力绝对是解决这个问题的更灵活的方法,因为它允许用户将图形暂时拖到边界框之外,然后图形就会恢复。根据图表的大小和显示区域的大小,您应该尝试不同的重力和电荷(斥力)相对强度以使图表适合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3 带边界框的力定向布局 的相关文章

  • d3树计算所有孩子的数量

    我有一个基于以下内容的 d3 树 http bl ocks org mbostock 1093025 http bl ocks org mbostock 1093025 我如何计算所有孩子的数量 我已经尝试过这个 但是它计算了树中的所有行
  • 在三角形内强制图表 d3.js

    我正在研究 d3 js 力图 我有一个问题 是否可以在具有某些坐标的三角形内制作力图 这是我的代码 var width 500 var height 500 margin var marginLeft 10 var marginTop 10
  • 将 D3 svg 保存为高质量图像

    有没有办法将 D3 SVG 图像保存为高质量图像 如果是的话请解释一下 截至目前 我正在使用以下代码将 svg 保存为图像 但我得到的图像质量不高 var canvas1 document createElement canvas canv
  • 我可以为我的 r 闪亮界面使用 index.html 和 ui.r 吗?

    在参照this http shiny rstudio com articles html ui html关于如何完全用 HTML 构建闪亮的应用程序 我想知道是否有任何方法可以将这种方法与传统的 ui r 方法结合使用 Reason Thi
  • d3.js:是否可以通过键而不是索引来进行转换?

    我有不同长度的数据数组 x值 年 是有限年数的一部分 例如 var data Year 2008 Value 5 Year 2009 Value 6 or var data Year 2007 Value 8 Year 2009 Value
  • D3.js - 如何迭代数据集中的子数组

    我试图让 d3 迭代数据中的子数组并生成多个饼图 这是完整的代码 来自https gist github com mbostock 1305111 https gist github com mbostock 1305111 and htt
  • d3.js 和 Chart.js 之间的比较(仅适用于图表)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在项目中多次使用过 Chart js 但从未使用过 d3 js 很多人说 d3 js 是最好的图表 javascript 框架 但没
  • d3.select 不适用于特殊字符

    我正在使用 d3 js 处理简单的图表 假设下面的 div 是我计划放置 d3 的 svg 容器的地方 div 但是当我使用 d3 select my div chart 我无法选择特定的 div 但是通过使用 java 脚本选择器 它可以
  • 为什么这个标题图形不随世界更新

    对于以下内容 我很高兴组合框默认为世界 但当收音机被点击时 我也希望标题移回 世界 我该怎么做 我有这个笨蛋 http plnkr co edit 9FXJXVqLZLPFdDrmVJez p preview http plnkr co e
  • 具有水平和垂直组合布局的可折叠树

    我正在尝试在 D3 中创建一个可折叠树 它结合了水平 第一级和第二级 和垂直 3 级 布局 这里有一个jsfiddle http jsfiddle net artemkolotilkin z7tb23Lo 到目前为止我所得到的 除了一件事之
  • D3js 多折线图 mouseOver

    我正在努力适应this http bl ocks org mbostock 3902569D3js 折线图示例 将鼠标悬停在我的多线图表上的使用情况 看起来d3 mouse this 0 on the mousemove函数生成以下错误 无
  • d3 地理投影从正交到 X 的过渡

    我正在开发一个教育地图项目 其中显示不同的地图投影 我想在选择不同投影之间实现变形过渡 我找到了一个很好的例子来实现它 并且我没有遇到太多的麻烦来重新创建它 不幸的是 我还需要裁剪投影的功能 这与目标状态完美配合 但在改变投影时则不然 当选
  • D3.js 中的点图

    我有兴趣创建一个Dot plot 每个数据值都有连续的点 但到目前为止我所管理的是为每个值创建一个点 更清楚地说 假设对于 array1 我希望第一个值创建 5 个圆圈 第二个值创建 4 个圆圈 依此类推 array1 5 4 2 0 3
  • 如何使用 D3 (或只是 javascript)将表单选项设置为“选择”

    有没有一种方法可以搜索选择表单元素中的所有选项 并将具有匹配值的选项指定为 已选择 var xStat G var statOptions Points PTS Goals G Assists A Penalty Minutes PIM c
  • 将元素添加到 D3 圆包节点

    我正在尝试制作一个可缩放的圆形包装图 我希望每个子圆圈包含一个较小的图表 该图表始终具有相同的结构 即 4 列 只有条形的高度会改变 我尝试添加一个简单的rect到目前为止我的图表 但矩形没有添加到圆圈中并且是静态的 JS var marg
  • 使用 d3 进行多级/分组轴标签

    我想知道是否有一种简单的方法可以在 d3 中添加多级 分层 分组轴标签 例如 如果我有一个折线图 其中 x 轴的月份名称跨越多年 那么我还希望将年份作为月份名称下方的标签 因此它看起来像这样 Oct Nov Dec Jan Feb Mar
  • d3力定向布局-链接距离优先

    在 d3 中使用力导向布局 如何使链接距离成为优先事项 同时仍然保持良好的图形布局 如果我指定动态链接距离 但保留默认费用 则我的图形距离会因费用函数而发生一些变形 并且不再是准确的距离 但是 如果我删除电荷 图表将如下所示 任何建议表示赞
  • 使圆圈与 d3.js 上的多线匹配相同的颜色过滤?

    我有一个多线图 当按每种水果过滤时会更新 每条线条颜色对应不同的销售年份 在 的帮助下Shashank https stackoverflow com users 5569282 shashank 每个数据点线上的圆圈已添加到组中 而不是直
  • 使用 CSS Grid,从任何地方滚动 div(不使用 jQuery 插件)

    div 怎样才能 scroll content https jsfiddle net blehmanade x1k3rhj7 33 可以从页面上的任何位置滚动吗 现在 scroll content仅当鼠标位于其上方时才可滚动 但是 当鼠标位
  • 在 Crossfilter 中使用过滤器

    我刚刚开始使用 crossfilter 和 d3 js 我正在尝试 API 参考中给出的一些片段 我有以下数据 var payments crossfilter date 2011 11 14T16 17 54Z quantity 2 to

随机推荐

  • 在 CUDA 统一内存多 GPU 或多处理器中使用原子算术运算

    我正在尝试实现一个使用统一内存的 CUDA 程序 我有两个统一的数组 有时它们需要原子更新 下面的问题有针对单 GPU 环境的答案 但我不确定如何扩展问题中给出的答案以适应多 GPU 平台 问题 cudaatomicAdd 示例无法产生正确
  • 爪哇芬威克树

    我尝试用 Java 实现 Fenwick 树 但没有得到预期的结果 这是我的代码 import java io import java util import java math class fenwick1 public static i
  • 需要为python打包jinja2模板

    更新 我提出了一个更好的问题和更好的答案here 我本来打算删除这个问题 但有些答案可能对未来的搜索者有用 我的问题与this 但这个答案很丑陋 需要一个目录结构 包括sharedtemplates templates templates
  • 在触发器中使用插入和删除的表

    我想编写触发器来处理插入和删除的表 我已经编写了插入触发器 CREATE TRIGGER FILL TABLE ON Person FOR INSERT AS DECLARE ID int SELECT ID p ID FROM Perso
  • 如何计算文档中的行数? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有这样的台词 我想知道我实际上有多少台词 09 16 39 AM all 2 00 0 00 4 00 0 00 0 00 0 00 0 00 0 00 94 00 09 16 4
  • C 中的逻辑运算不符合预期

    有人可以解释一下以下代码的功能吗 include
  • 如何在CSS中绘制循环箭头?

    如何使用 CSS 在中心绘制循环箭头和文本 如下图所示 我尝试过创建曲线箭头 但我不知道如何使其看起来像我想要的那样 arrow width 200px height 200px border 6px solid border radius
  • 通过 setup.exe 创建日志的 msiexec 参数不起作用

    我正在尝试从我的安装中获取使用以下命令的日志setup exe 我可以得到一个日志setup exe V l v c temp installlog txt 但我想通过x参数以及获取 额外的调试信息 当我尝试时setup exe V l v
  • 如何根据 swift 3 中的数组选择复选标记?

    我有一个数组 其中选定的名称将被存储并传递到视图控制器之前 当我需要转到上一个视图控制器时 则需要选择先前选择的复选标记 但在这里它启用了最后一个选定的元素 唯一的问题是如果我选择三个 那么它不是选择三个 它只是检查标记最后一个元素 但我需
  • C# 不通过返回类型推断重载方法

    我正在编写一个 C 程序来抓取目录并提供最后 CSV 行中的日期小于当前日期的文件列表 由于这是一个程序 因此我并没有真正花费太多时间使代码变得非常干净或任何东西 但这只是一个意见问题 我想 奇怪的是下面的一组代码片段 三个静态方法都在同一
  • AngularUI - 兼容的浏览器

    我尝试打开 AngularUI 网站 http angular ui github io 在 IE8 中 UI 在 IE8 中无法正确呈现 在最新版本的 chrome firefox 中工作正常 这促使我搜索 AngularUI 模块的浏览
  • IndexError:列表赋值索引超出范围 - 使用数组的 Python

    我最近开始使用 python 但对于该语言的很多东西我仍然是新手 这段代码应该打印一系列行 例如 47 815 47 54 48 065 57 45 我从几个文本文件 称为 2t1 2t19 3t1 3t19 作为输入以及结束后的文件名 每
  • Cheerio 不会等待正文加载

    我制作了一个非常简单的脚本 它抓取了一个食谱网站以获取标题 准备时间和成分 除了脚本无法抓取数组的每一页之外 一切工作正常 有时我得到 4 个 有时 2 个 有时甚至 0 个 看来脚本不会等待主体完全加载 我完全知道 Cheerio 不理解
  • 带有被安全/ASR 规则阻止的宏的工具 - 如何修复?

    我有一个 Excel 工具 xlsm 文件 我正在向用户传播 他们从我们的网站下载该文件 然后就可以使用它 简而言之 该工具有自己的菜单栏和一堆宏 例如进行计算 从 API 提取数据等 我使用 Unviewable 对用户隐藏代码 我用证书
  • 是否可以以编程方式检测 元素中的插入符位置?

    假设有一个常规的
  • 在python中比较两个字典以获得相似键的最大值

    我有这两个命令 a test1 90 test2 45 test3 67 test4 74 b test1 32 test2 45 test3 82 test4 100 如何提取同一键的最大值以获取新字典 如下所示 c test1 90 t
  • 使用delphi将PNGImage转换为灰度

    你好呀 这是我的代码 procedure TForm4 Button1Click Sender TObject var png TPNGImage data PRGBQarray p tagRGBQuad i o integer begin
  • 在Where 子句或替代选项中使用别名?

    我如何让它工作 它可以在没有Where子句的情况下工作 否则使用Where子句 我会得到明显的错误 但这基本上是需要做的 有人知道如何解决这个问题吗 select ID Name case T N when 1 then City1 whe
  • PUSH 数组 C++?

    如何动态向数组添加值 推送 我可以在 AS3 中执行此操作 但在 C 中找不到它的函数 如果它是静态定义的数组 则不能 如下所示 int array 10 它的大小是固定的 但是 如果您使用诸如std vector你会用 std vecto
  • D3 带边界框的力定向布局

    我是 D3 新手 在设置力导向布局的边界时遇到困难 我已经设法 从示例中 拼凑出我想要的内容 但我需要包含图表 在刻度函数中 变换 翻译将正确显示我的图形 但是当我将 cx 和 cy 与 Math max min 一起使用时 请参阅注释代码