我想知道是否可以为每个数据点附加多个矩形。 在我的示例中,有三个数据点。 对于每个我尝试创建2个矩形。 最后必须有6个矩形。 3红色,3蓝色。 IMAGE
根据this的答案,我尝试了以下解决方案:
var svg = d3.select("body").append("svg");
svg.selectAll("rect")
.data([10,60,120])
.enter()
.append("g")
.append("rect")
.attr("width", 20)
.attr("height", 20)
.attr("x", 20)
.attr("y", function(d) {return d})
.attr("fill", "red")
.selectAll("rect")
.data(function(d) { return d3.range(d); })
.enter()
.append("rect")
.attr("width", 20)
.attr("height", 20)
.attr("x", 60)
.attr("y", function(d) {return d})
.attr("fill", "blue");
不幸的是,蓝色矩形是在红色矩形内部创建的。任何想法如何实现这一目标? 这是EXAMPLE
答案 0 :(得分:0)
您已经成功创建了额外的矩形,但是不幸的是,它们都嵌套在前三个矩形内。如果您的浏览器上有一个Web开发人员扩展,请选择一个矩形,然后查看源代码。
如果要附加矩形,而不是将其嵌套在原始矩形内,则需要将两个矩形都附加到g
节点上。绑定数据并添加g
节点时,请将这些节点分配给变量:
var svg = d3.select("body").append("svg");
var nodes = svg.selectAll(".rect")
.data([10,60,120])
.enter()
.append("g")
.classed('rect', true)
然后,您可以将两个矩形附加到g
节点:
// red rectangles
nodes.append("rect")
.attr("width", 20)
.attr("height", 20)
.attr("x", 20)
.attr("y", function(d) {return d})
.attr("fill", "red")
// blue ones
nodes.append("rect")
.attr("width", 20)
.attr("height", 20)
.attr("x", 120)
.attr("y", function(d) {return d})
.attr("fill", "blue")
请注意,如果您这样做:
var nodes = svg.selectAll("rect")
.data([10,60,120])
.enter()
.append("g")
.append("rect")
.attr("width", 20)
.attr("height", 20)
.attr("x", 20)
.attr("y", function(d) {return d})
.attr("fill", "red")
nodes
将是对rect
元素的引用,因为它们是最后添加的内容,并且附加到nodes
的所有内容都将添加到内部rect
个元素。
还请注意,您只需要将数据绑定到g
元素一次;这些g
元素的所有子节点都会自动继承它。
这是完整的示例:
var svg = d3.select("body").append("svg");
var g = svg.selectAll(".rect")
.data([10,60,120])
.enter()
.append("g")
.classed('rect', true)
g.append("rect")
.attr("width", 20)
.attr("height", 20)
.attr("x", 20)
.attr("y", function(d) {return d})
.attr("fill", "red")
g.append("rect")
.attr("width", 20)
.attr("height", 20)
.attr("x", 120)
.attr("y", function(d) {return d})
.attr("fill", "blue")
<script src="https://d3js.org/d3.v5.js"></script>