【问题标题】:D3: move circle between two different g elements in force layoutD3:在力布局中两个不同的g元素之间移动圆圈
【发布时间】:2013-07-30 15:02:05
【问题描述】:

我有两个 g 元素,每个元素都包含圆圈。圈子使用force.layout 组织。 g 元素正在转换。

您可以在此处查看:demo。精简代码:



    var dots = svg.selectAll(".dots")
    .data(data_groups)
    .enter().append("g")
    .attr("class", "dots")
    .attr("id", function (d) {
     return d.name;
    })
    ...
    .each(addCircles);

    dots.transition()
    .duration(30000)
    .ease("linear")
    .attr("transform", function (d, i) {
        return "translate(" + (150 + i * 100) + ", " + 450 + ")";
    });

    function addCircles(d) {

        d3.select(this).selectAll('circle')
        .data(data_circles.filter(function (D) {
            return D.name == d.name
        }))
        .enter()
        .append('circle')
        .attr("class", "dot")
        .attr("id", function (d) {
            return d.id;
        })
        ...
        .call(forcing);
    }

    function forcing(E) {

        function move_towards(alpha) {
            ...
        }

        var force = d3.layout.force()
        .nodes(E.data())
        .gravity(-0.01)
        .charge(-1.9)
        .friction(0.9)
        .on("tick", function (e) {
            ...
        });
        force.start();
    }

我需要使用转换将圆圈(例如 id=1)从第一个 g 元素移动到第二个元素。

欢迎提出任何建议。

【问题讨论】:

    标签: javascript d3.js transition force-layout


    【解决方案1】:

    可以的。

    我所做的是:

    1) 使用 jquery 将点追加到目标组 2)使用变换(无过渡)将点移回其原始位置 3) 将点转移到它的新位置

    jQuery 用于appendTo 方法。可以去掉,换成一些纯 Javascript 的东西,但还是很方便的。

    我有一个部分工作的小提琴here. 绿色点工作正常,但蓝色点出了点问题。不知道为什么。

    【讨论】:

    • 不错。但是在那之后,你还可以使用 d3 来进行数据更新、插入、删除等操作吗?因为你基本上是从 d3 的眼睛下面“偷”了一个元素,不是吗?
    • 这取决于你想做什么。文档的数据结构将不再与元素的结构匹配,因此任何需要更改数据结构的操作都无法正常工作。话虽如此,如果您更改某个项目所属的组之类的内容,则应该更改数据结构以匹配。
    • 通常d3通过将数据结构镜像到ui来做事。显示在组之间移动的东西并没有反映在数据中,因此它不属于 d3 的一般数据操作范式(在我看来,这是正确的。)因此,需要一些 jquery 黑客来实现复制/粘贴行为。如果要以可互换的方式组织它们,我认为将所有点放在同一组中会更好,但是在组之间移动内容似乎很有趣:)
    • 你是对的,你总是可以在后台更改数据结构。如果你在 data() 中正确定义了标识函数,d3 应该能够识别新元素,就好像它是自己创建的一样,更进一步……很好!
    【解决方案2】:

    在我看来,过渡作用于单个元素。如果一个元素在 DOM 树中改变了它的位置,从一个 g 到另一个,我想不出一种方法来使它成为一个平滑的过渡,因为它基本上是一个二元拆分:现在在一个 @987654322 下有一个元素@,现在它不见了,但在其他地方还有一个。

    为了实现我认为您想要做的事情,我会做些什么:将所有内容分组在同一个“g”下,单独分配颜色和翻译,然后为您想要更改的单个元素更改颜色和翻译。

    但不要认为这是一个可靠的声明,即你不能按照你最初想要的方式去做。

    【讨论】:

    • 我喜欢 ckersch 为此从 d3 中迈出一步的解决方案。为了争论而保留这个答案,看看是否有人证明我是错的,即使在“不在 d3 范围内”这一点上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多