2014-09-11 43 views
0

我希望把周围的一些SVG圈的SVG圈。我找到了使用d3.selectAll().filter()的所需圆圈。这几乎奏效 - 创建一个圆圈。但我无法弄清楚如何从旧圆的中心设置新圆的中心,因此新圆创建在0,0。没有我试过的工作。使用d3.select从另一个圆的属性设置圆的属性?

// first I find the circles I want 
foundNodeCircles = d3.selectAll(".node").filter(function(d,i){return d.label == nodeRE;}); 

// Then I create a new, larger circle for each circle that I found: 
svg.selectAll(".nodeHighlightRing") 
.data(foundNodeCircles) // make one ring per node circle 
.enter().append("circle") // make the ring 
.attr("class", "nodeHighlightRing") // specify its qualities 
.attr("cx", function(d) { return d.cx;}) // BROKEN: set center to center of old circle 
.attr("cy", function(d) { return d.cy;}) // BROKEN: set center to center of old circle 
.attr("r", 10) 
.style("opacity", 0) 
.style("stroke", "green") 
.style("stroke-width", "1.5") 
.style("stroke-opacity", "1"); 

在除了d.cx,我已经试过this.cxd.attr["cx"]this.attr["cx"]d3.select(this).attr("cx")d3.select(d).attr("cx"),而且似乎不太可能奏效一些其他的东西。没有成功。

我认为this问题或this one会帮助,但我显然做了一些不同的事情。

+0

我们可以看看你在foundNodeCircles中得到了什么,或者做一个小提琴我们可以对它做些什么。 – 2014-09-11 05:58:12

+0

谢谢@ saikiran.vsk。 jshanley猜对了。我将不得不更多地了解小提琴的世界。 – Mars 2014-09-12 04:08:26

回答

2

问题是您的变量foundNodeCircles正在保存d3选择,并且数据加入方法.data()需要一个表示数据的数组。

如果您改为使用foundNodeCircles[0]进行数据连接,则将引用选择中包含的元素数组,而不是选择本身。然后,当你设置你的属性,d将参考的DOM元素本身,所以你可以使用一个D3的选择,选择d和呼叫.attr要获得的属性,或者干脆使用DOM方法.getAttribute

svg.selectAll(".nodeHighlightRing") 
    // BIND TO THE ELEMENTS RATHER THAN THE SELECTION 
    .data(foundNodeCircles[0]) 
    .enter().append("circle") 
    .attr("class", "nodeHighlightRing") 
    // EITHER OF THESE METHODS SHOULD WORK 
    .attr("cx", function(d) { return d3.select(d).attr("cx"); }) 
    .attr("cy", function(d) { return d.getAttribute("cy"); }) 
    // ... etc. ... 
+0

非常明亮。我*对选择与数组和数据与DOM元素的选择感到困惑。对于我来说,在这里我不能使用'd.cx'仍然很奇怪,但是我会认为这是另一天学到的教训。 – Mars 2014-09-12 04:04:59

+0

啊,因为DOM元素不是简单的JavaScript对象(数组,散列,无论他们是)。或者说,属性不是普通的Javascript字段。和'd3.select(d).attr()'的作品,因为它使从DOM对象D3选择对象,而且只有具有了'.attr()'功能选择对象?不知道我的术语是否完全正确。 – Mars 2014-09-12 04:13:16

+0

是的,你在现场。 JavaScript具有用于操纵DOM元素的内置方法,而且d3在后台使用它们。当调用'.attr'上的选择,D3调用本机方法'Element.getAttribute'或'Element.setAttribute'(取决于你是否分别传递1个或2个参数,)包含在所述选择元件上。这就是为什么我发布的两种方法是等价的。 – jshanley 2014-09-12 13:49:43

相关问题