javascript - d3 从 svg 元素中选择数据

标签 javascript d3.js svg

在我的 d3 代码中选择 g 元素时遇到问题,并且不知道该怎么做。

代码

var vis = d3.select("#custom-view").append('svg:svg').attr('width', w).attr('height', h);

d3.range(lengthJson).forEach(function (t) {
         vis.append("g")
         .attr('width', wBlob)
         .attr('height', hBlob);

          return t

});

var blobs = **tried numerous things here**.selectAll('g').data(graph.nodes)
        .enter()
        .append('rect')
        (....do a lot more code...)

问题

上面描述的代码根据 JSON 文件的长度将元素添加到元素中。然后我希望它将元素附加到其中的每个元素。

我尝试过的事情

尝试将其声明为变量

var gCode = vis.append("g")

如果在制作 g 元素时未将其包装在 forEach 函数中,则该方法有效

我尝试在属性中分配一个类,并以这种方式通过所有 g 元素进行选择。

还尝试为 svg 元素提供一个 ID 并以这种方式选择它,但没有成功

最佳答案

不要使用循环,例如 forEach ,在 D3 代码中附加元素。

当然,我们在 D3 代码中始终使用循环(for 循环、for...in 循环、forEach 循环等...),因为 D3 是 JavaScript...但我们不使用循环附加元素,这不是惯用的方式。最终我们使用循环来附加元素,但在非常具体和罕见的情况下。

在 D3 代码中使用循环附加元素不仅很尴尬,而且有时它会让您陷入没有(简单)解决方案的情况。就像这个一样。

在您的情况下,惯用的方法是嵌套输入选择

因此,根据数据集的长度使用回车选择来附加您的组,然后使用内部回车选择来附加矩形或您想要的任何元素。

这是一个非常基本的示例,使用 <div><tspan> s:

var data = ["foo", "bar", "baz"];
var body = d3.select("body");
var colors = d3.scaleOrdinal(d3.schemeCategory10)
var divs = body.selectAll(null)
  .data(d3.range(data.length))
  .enter()
  .append("div")
  .style("background-color", function(d) {
    return colors(d)
  });
var texts = divs.selectAll(null)
  .data(data)
  .enter()
  .append("tspan")
  .text(function(d) {
    return d + " "
  })
<script src="https://d3js.org/d3.v4.min.js"></script>

在上面的演示中,data数组有 3 个元素。因此,第一个(或外部)输入选择将在正文中附加 3 个 div。

然后,第二个(内部)选择将为每个 div 附加数据数组中的 3 个元素。

关于javascript - d3 从 svg 元素中选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439311/

相关文章:

html - svg 矩形边框未正确绘制

javascript - 将措辞的 CSS 值转换为数字

javascript - D3.js:获取所选下拉选项的文本?

html - 使用 CSS 在 Webkit 中不起作用的 defs 文件中的目标 SVG 图标

d3.js - 在 webpack 中使用 d3.js 作为外部

javascript - 使用 D3、VX 和 React 的多个 parent 的家谱

javascript - 使用带有 CSS 过渡的 SVG 图像调整 div 的大小会导致 Firefox 中出现奇怪的交叉线

javascript - 无法通过 Node.js 将 Heroku 配置变量传递到 Angular CLI 应用程序

javascript - Knockout-Sortable:从排序列表中排除项目

javascript - jQuery UI tabs.add() 创建两个选项卡,其中一个处于奇怪的位置,空且未使用