【问题标题】:d3 issues with entering elements after pand3 平移后输入元素的问题
【发布时间】:2014-04-20 11:58:26
【问题描述】:

我在平移时使用了变换,从几个示例中复制而来。

zoom = d3.behavior.zoom()
    .x(this.xScale)
    .scaleExtent([0.5, 2])
    .on("zoom", zoomFunction(this))
    .on("zoomend", zoomEndFunction(this));

svg = histogramContainer.append("svg")
    .attr('class', 'chart')
    .attr('width', width)
    .attr('height', height)
    .call(zoom)
    .append('g')
    .attr('transform', 'translate(' + this.margin.left  + ' , ' +
            (height - this.margin.bottom) + ')');

function zoomFunction(scope) {
    return function() {
        var that = scope;

        that.xDelta = d3.event.translate[0];
        that.zoomScale = d3.event.scale;

        // some other code removed for simplicity

        svg.selectAll(".stackedBar").attr("transform", "translate(" +
                                that.xDelta + ",0)scale(" +
                                that.zoomScale + ", 1)");
    };
}

问题在于,由于新元素在 之后进入 pan 然后“旧”元素应用了 transform 属性,但新元素没有。

这会破坏未来的平移,因为旧元素将从缩放前 xScale 绘制它们的位置转换,而新元素将从缩放调整后的 xScale 转换。

在我看来,我可以使用缩放调整后的 xScale 重绘旧元素,但我不确定何时以及如何在“幕后”执行此操作。

或者,我可以使用旧的 xScale 绘制新元素,并对它们应用与旧元素相同的变换。这似乎更混乱,因为元素会来来去去,我必须跟踪“当前变换”。我的直觉告诉我“状态太多”。

【问题讨论】:

    标签: d3.js


    【解决方案1】:

    通常,如果您将比例附加到缩放行为,则使用修改后的比例重新绘制条形,使用与最初放置条形的方式完全相同的代码,让比例完成所有工作。

    我在之前的回答中链接到this discussion,所以您现在可能已经阅读了;如果没有,这可能是一个很好的开始,让您了解在 d3 中进行缩放的不同方法;它逐步分解每种方法。您目前正在使用两种方法(转换与比例)的混合,我认为这会导致跟踪问题。

    【讨论】:

    • 天哪,我刚刚读了另一个答案..你应该写一本书。实际上有两个,一个用于数据可视化,另一个应该是自传。 FWIW,正如我在this question 中提到的那样,我正在做另一种类型的缩放(也许)。基本上,更深入地了解数据。我实际上已经很好地工作了(通过在将数组传递给 D3 之前解析数组)所以我会回答这个问题。谢谢。
    • 我仍在试图弄清楚如何以及何时使用新的 xScale 重绘元素。也许在'zoomend'上?有趣的是,我认为除了 drawChartupdateChart 函数之外,我还需要一个 redrawChart 函数,因为我不想将旧数据加入新数据,而是“刷新”它(以删除转换)。
    • 另外,FWIW,我同时使用了变换和缩放来给用户视觉反馈。然后我会重新绘制整个图表,在重新合并数据后(缩放,而不是平移)。现在我要使用数据连接进行转换,我必须重新处理所有这些。无论如何,这是我使用两者的想法(可能不正确) - 爆炸或缩小 SVG 以提供用户反馈。跨度>
    • 使用转换的快速缩放功能没有错。但是,将所有图形放在 <g> 元素中并对其进行转换会更容易,而不是转换每个矩形。这样,默认情况下,转换将应用于添加到组中的任何新元素,并且您不会放弃缩放位置。 (尽管您可能仍然希望在更新后重置缩放,以便用户可以清楚地看到任何更改的数据。)
    猜你喜欢
    • 2020-07-14
    • 2013-04-22
    • 2015-08-11
    • 2018-01-23
    • 1970-01-01
    • 2021-04-19
    • 2012-11-17
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多