我提取了一些数据,并在缩放后绘制了一堆圆圈。这效果非常好。
var gSet = graph1.selectAll("g").data(data).enter().append("g");
gSet.append("circle")
.attr({ cx: posX, cy: posY, r: dotSize })
.attr("class", "dataPoint");
现在,我想把这些点联系起来。我见过的大多数例子都是关于条形,而不是线条,所以我用谷歌搜索了更多 line charts并决定使用路径元素,就像这样。
var gSet = graph1.selectAll("g").data(data).enter().append("g");
gSet.append("circle")
.attr({ cx: posX, cy: posY, r: dotSize })
.attr("class", "dataPoint");
gSet.append("path")
.attr("d", d3.svg.line().x(posX).y(posY))
.attr({ "stroke": "yellow", "stroke-width": "1" });
屏幕上没有出现任何新内容,并且由于无知,我不知道该在哪里戳一下看看出了什么问题。
- 我应该使用路径(还是线、折线等更好的选择)?
- 我应该使用 d 属性还是有更合适的属性?
- 我应该应用d3.svg.line()函数还是有更平滑的方法?
最佳答案
我碰巧做了一些与我认为你想要的类似的事情,所以我将其按原样粘贴在 this jsfiddle 中,它将向您展示一种可能的连接线路的方法。这个图更像是一个父/子图,但这只是基于数据。您可以删除父属性并将每个节点链接到前一个节点。
回答您的问题:
你可以使用路径,但如果你只想要直线,那就有点矫枉过正了。如果你的情况很简单,那么我推荐 line。
如果使用路径对象,d 属性将描述路径的形状。使用 D3js,人们经常使用 d 作为匿名方法的两个可选参数之一(d 是数据,i 是递增计数器)。
您可以使用 d3.svg.line() 函数来描述线条的形状和位置,但如果您的数据像听起来一样简单,那么这可能有点过头了 - 考虑仅将线条对象附加为如下面我的代码所示。如果您需要“花哨的线条”,我的建议是选择一条路径,但这只是我的舒适区,可能还有其他方法。
对于我的方法,代码最终看起来像这样
var items = svg.selectAll("g").data(srcData).enter().append("g");
items.each(function(d, i){
d3.select(this).attr("transform","translate("+d.posx+","+d.posy+")");
if(d.parentid > 0)
d3.select(this).append("line")
.attr("x",0)
.attr("y",0)
.attr("x1",function(d){ return -1*(d.posx - parent(d.parentid).posx); })
.attr("y1",function(d){ return -1*(d.posy - parent(d.parentid).posy); })
.style("stroke",d.color)
.style("stroke-width",2);
d3.select(this).append("circle")
.attr("r",5)
.style("fill",d.color);
});
关于javascript - 如何用线连接D3中的点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35067611/