javascript - 如何在 D3 中 append 多个矩形?

标签 javascript d3.js append rectangles

我想知道是否可以为每个数据点 append 多个矩形。 在我的例子中有三个数据点。 对于每个我尝试创建 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

最佳答案

您成功创建了额外的矩形,但遗憾的是它们都嵌套在前三个矩形内。如果您的浏览器上有 Web 开发人员扩展,请选择其中一个矩形,然后查看源代码。

如果您想 append 矩形,而不是将它们嵌套在原始矩形内,则需要将两个矩形都 append 到您的 g 节点。当您绑定(bind)数据并添加您的 g 节点时,将这些节点分配给一个变量:

var svg = d3.select("body").append("svg");

var nodes = svg.selectAll(".rect")
  .data([10,60,120])
  .enter()
  .append("g")
  .classed('rect', true)

然后您可以将这两个矩形 append 到 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 元素的引用,因为它们是最后添加的内容,并且将添加 append 到 nodes 的任何内容 rect 元素内。

另请注意,您只需将数据绑定(bind)到 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>

关于javascript - 如何在 D3 中 append 多个矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52821117/

相关文章:

javascript - 为什么我的 nodejs 代码中的第一个和第二个套接字请求之间存在差异?

javascript - xAxis ordinal() 不从左 Angular 开始

python - 将列表列表和 "distributing"元素从另一个列表获取到子列表的 Pythonic 方法是什么?

javascript - 如何将 perl 哈希转换为 javascript 哈希

javascript - 如何使用 javascript 正则表达式多次捕获多个组

javascript - 三元运算符检查返回0,同时检查jsx react js

javascript - 在 C3 图表中设置范围属性

node.js - dc.js 与 Node.js 服务器端

c# - 使用 StringReader 追加文本(在 reader.ReadLine() 之后)

javascript - 如何使用 jQuery 实时检查元素是否为空