I am trying to create a function that takes a d3.select() object and appends an arc path to it using the d3.arc() method.
It will work if I draw a rectangle but when I try it with the d3.arc() method, the debugger/breakpoint shows that it returns the arc() function instead of the path.
Here’s a stripped down version of the code.
let render_rect = function(ct){ // rectangle drawing function
ct.append("rect")
.attr("x", 29)
.attr("y", 18)
.attr("width", 76)
.attr("height", 11)
.attr("fill", "#A00");
};
let render_toi_arc = function(ct){ // arc drawing function
ct.append("g")
.append("path")
.attr("d", function(d){
return d3.arc()
.innerRadius(d.toi)
.outerRadius(d.toi+5)
.startAngle(0)
.endAngle(Math.PI/2);
})
};
let toi_arcs = svg.selectAll("g.toi")
.data(toi)
.join("g")
.each(function(t){
current_toi = d3.select(this);
render_toi_arc(current_toi); // nope. doesn't work
render_rect(current_toi); // works
});
Is it because arc is a function itself unlike appending an svg element?
Advertisement
Answer
“Is it because arc is a function itself?”. Yes, the arc generator is a function. Therefore, you have to call it:
let render_toi_arc = function(ct){ // arc drawing function
ct.append("g")
.append("path")
.attr("d", function(d){
return d3.arc()
.innerRadius(d.toi)
.outerRadius(d.toi+5)
.startAngle(0)
.endAngle(Math.PI/2)();
//parentheses here----------^
})
};