将 d3.js 气泡转换为基于强制/重力的布局

2024-02-08

我有一组数据,正在使用 d3.js 进行可视化。我以气泡的形式表示数据点,其中气泡的配置如下:

var dot = svg.selectAll("g")
            .data(data)
            .enter()
            .append("g");

dot.append("circle")
  .attr("class", "dot")
  .attr("cx", function(d) { return xp(x(d)); })
  .attr("cy", function(d) { return yp(y(d)); })
  .style("fill", function(d) { return colorp(color(d)); })
  .attr("r", function(d) { return radiusp(radius(d)*2000000); });

dot.append("text")
   .attr("x", function(d) { return xp(x(d)); })
   .attr("y", function(d) { return yp(y(d)); })
   .text(function(d) { return d.name; })

其中xp、yp、colorp和radiusp定义如下:

var xp = d3.scale.log().domain([300, 1e5]).range([0, width]),
   yp = d3.scale.linear().domain([10, 85]).range([height, 0]),
   radiusp = d3.scale.sqrt().domain([0, 5e8]).range([0, 40]),
   colorp = d3.scale.category10();

此时,气泡在其位置上显示为静态(其中位置由 xp 和 yp 定义),而气泡的大小基本上来自半径 p,颜色由 colorp 定义。

现在我正按照这个例子展示它们: http://bl.ocks.org/mbostock/4063269 http://bl.ocks.org/mbostock/4063269

我需要的是以这种形式显示它们: http://jsfiddle.net/andycooper/PcjUR/1/ http://jsfiddle.net/andycooper/PcjUR/1/

即:它们应该利用重力作用堆积,具有一定的电荷,可以相互拖动并有一定程度的相互排斥。我可以看到有一种方法可以通过 d3.layout.force() 但实际上无法将其集成到此中。如果您能建议我正确的路径或一些工作示例甚至提示,我将非常感激。谢谢。


我想你已经快到了,但是你的规格dot变量不是最好的。我会把它改成这样:

    var dot = svg.selectAll(".dot")
        .data(data)
        .enter()

之后,一旦绘制了圆圈,您要做的就是创建一个force布局,用刚刚创建的节点实例化它,添加一个on("tick")方法,然后start布局。示例如下:

var force = d3.layout.force().nodes(data).size([width, height])
            .gravity(0)
            .charge(0)
            .on("tick", function(e){
                dot
                .each(gravity(.2 * e.alpha))
                    .each(collide(.5))
                    .attr("cx", function (d) {return d.x;})
                    .attr("cy", function (d) {return d.y;});
            })
            .start();

为了获得完整的答案,我还将添加gravity and collide小提琴中的方法(带有调整后的变量名称)

    function gravity(alpha) {
        return function (d) {
            d.y += (d.cy - d.y) * alpha;
            d.x += (d.cx - d.x) * alpha;
        };
    }   

    function collide(alpha) {
        var padding = 6
        var quadtree = d3.geom.quadtree(dot);
        return function (d) {
            var r = d.r + radiusp.domain()[1] + padding,
                nx1 = d.x - r,
                nx2 = d.x + r,
                ny1 = d.y - r,
                ny2 = d.y + r;
            quadtree.visit(function (quad, x1, y1, x2, y2) {
                if (quad.point && (quad.point !== d)) {
                    var x = d.x - quad.point.x,
                        y = d.y - quad.point.y,
                        l = Math.sqrt(x * x + y * y),
                        r = d.r + quad.point.r + (d.color !== quad.point.color) * padding;
                    if (l < r) {
                        l = (l - r) / l * alpha;
                        d.x -= x *= l;
                        d.y -= y *= l;
                        quad.point.x += x;
                        quad.point.y += y;
                    }
                }
                return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
            });
        };
    }

我认为您遇到的问题是,也许您正在将力布局应用于g每个圆圈的元素,不幸的是它不起作用。我希望这能让您了解如何继续。你的最后一行dot声明添加了一个g每个圆都有一个元素,这有点难处理。

Thanks.

PS 我假设x, y, and r你的属性data包含x,y, and radius.

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

将 d3.js 气泡转换为基于强制/重力的布局 的相关文章

随机推荐

  • apache 全局基本身份验证

    我有 apache Web 服务器和几个虚拟主机 我希望它们都支持基本授权 AuthType Basic 但是 Auth 指令似乎仅适用于
  • NSURLSession 使用 get 发送参数

    我正在尝试解析来自 php 的信息 但我需要发送一个字典参数 所以我尝试了一些事情 我看到了教程 示例 但我陷入困境 所以我回到了开始 这是什么好方法这样做吗 func asd let urlPath http xxxxx php let
  • 为什么 Spyder 在 OS X 中这么慢?有没有办法让它更快?

    我安装了 Spyder 作为 Anaconda Python 分析包的一部分 但我发现编辑器非常慢 按键和屏幕上显示字母之间总是有半秒的延迟时间 我在一台相当新的 i7 MacBook 上使用 Spyder 这个问题是由 Qt 产生的 Qt
  • 监听/通知 pgconnection 宕机了 java?

    我正在使用 PostgreSQL DB 并应用它LISTEN NOTIFY功能 所以我的监听器位于我的 AS 应用程序服务器 上 并且我在数据库上配置了触发器 这样当对表执行 CRUD 操作时NOTIFY请求在 AS 上发送 LISTENE
  • python 类继承树

    假设我有这样的课程 class a object pass class b a pass class c b pass class d c pass class e b pass 我想要一个可以执行以下操作的函数 gt gt gt get
  • 哈希表和子串匹配

    我有数百个键 例如 红苹果 maninred foraman 蓝苹果 我有与这些键相关的数据 数据是一个字符串 末尾有相关的键 红苹果 树上有红苹果 maninred 她看到了maninred 孔洞 他们买了现在的孔洞 蓝苹果 令人惊讶 但
  • 在 C++ 中创建全局“常量”的正确方法[重复]

    这个问题在这里已经有答案了 通常 我定义真正的全局常量 比如说 pi 的方法是将 extern const 放置在头文件中 并在 cpp 文件中定义该常量 常量 h extern const pi 常量 cpp include consta
  • T-SQL。如何在一个 SELECT 中创建列表作为逗号分隔的字符串?

    MS SQL 2005 T SQL 我发现了很多如何分割字符串的好解决方案 但是如何将内部 SELECT 的结果组合为字符串 例如 使用逗号分隔符 代码 SELECT b date SELECT o number FROM order o
  • 为什么 flutter 停止在 ios 上启动我的应用程序

    突然之间 我无法运行使用 firebase 的 flutter 应用程序 显然 pod 安装过程存在问题 某些依赖项不兼容 鉴于我没有更改 yaml 文件中的任何内容 并且应用程序今天早上运行良好 我认为工具存在问题 而不是我的源代码 这个
  • XAML WPF 中 {x:Static} 和 {StaticResource} 之间的区别

    有什么区别 x Static and StaticResource 在 WPF 的 XAML 代码中 例如
  • MySql 对视图列的注释?

    MySql 是否可以存储视图列的注释 我知道如何向普通表和列添加注释 但我不确定是否可以对视图这样做 我所知道的是视图 对于某些方面 的行为就像表一样 因此可以像这样运行查询 SELECT column name column commen
  • 捕获 Global.asax 中的错误

    我的中有以下内容Global asax这是为了处理错误 void Application Error object sender EventArgs e Exception exception Server GetLastError if
  • Android:重叠两个视图(故意的!)

    只是想知道是否可以重叠两个元素 这是我试图实现的目标的说明 基本上它是一个圆形的 ImageButton 其中心位于矩形的角上 我应该如何定位它 我可以使用RelativeLayout或其他东西吗 您可以对蓝色框使用相对布局 将 Image
  • Decimal.TryParse 不解析我的十进制值

    当我尝试转换类似 0 1 的值 来自文本框中的用户 时 我的值 b 始终为 false bool b Decimal TryParse 0 1 out value 怎么会来这里工作呢 指定解析的区域性 您当前的文化可能使用某种不同的数字格式
  • Scala 中闭包的内存管理是如何工作的?

    Scala 允许像这样的闭包 def newCounter var a 0 gt a 1 a 它定义了一个函数 每次调用时都会返回一个新的独立计数器函数 从1 scala gt val counter1 newCounter counter
  • 如何实现低通滤波器?

    我正在对陀螺仪和加速度计数据进行一些数学运算 我想对结果数据进行低通滤波 那么有人可以发布一些低通滤波器的通用代码吗 一阶 IIR 低通滤波器可以采用以下形式 output value rate input value 1 0 rate p
  • 在 iPad/iOS6.0 上使用“应用程序锁定”配置文件设置(又名“信息亭模式”)时出错

    背景 作为 iOS6 的一部分 Apple 为其 iPad 提供了一种 信息亭模式 该模式将设备锁定到一个应用程序中 甚至也可以直接启动到该应用程序中 非常适合在零售店 餐厅 等场所使用 iPad 为了使用此功能 首先必须使用 Apple
  • NoSQL:从表 DynamoDB/Azure 表存储获取最新值

    我有一个小问题需要一些建议 假设我们有几百个数据表 每个数据表有几千万行 数据表是时间戳 键 值 数据表每秒写入一次 每个表的最新条目应该可以快速获取 并且很可能被查询最多 有点像 实时跟踪数据 由于缺少 Last 或类似的内容 我正在考虑
  • 如何在左侧对 UITableViewCell 进行重新排序控制?

    我正在做一个新闻阅读器应用程序 我想让用户可以选择显示 隐藏新闻类别 例如热门新闻 商业 技术 体育等 并像 Android 中的 BBC 新闻应用程序一样重新排序 见下图 我的问题是 如何在单元格左侧进行重新排序控制 编辑模式下默认位置在
  • 将 d3.js 气泡转换为基于强制/重力的布局

    我有一组数据 正在使用 d3 js 进行可视化 我以气泡的形式表示数据点 其中气泡的配置如下 var dot svg selectAll g data data enter append g dot append circle attr c