Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据数据使用D3 append()函数添加可变数量的节点_Javascript_Svg_D3.js - Fatal编程技术网

Javascript 如何根据数据使用D3 append()函数添加可变数量的节点

Javascript 如何根据数据使用D3 append()函数添加可变数量的节点,javascript,svg,d3.js,Javascript,Svg,D3.js,为了说明这个问题,让我们以下面的简单数据示例为例,其中我有一个要显示的对象列表。每个对象由一个形状和一个可变的线列表组成 var data = [ { "shape": "circle", "x": 10, "y": 20, "lines": [ {x1: "-10", y1: "-10", x2: "10", y2: "10"} ] }, { "sha

为了说明这个问题,让我们以下面的简单数据示例为例,其中我有一个要显示的对象列表。每个对象由一个形状和一个可变的线列表组成

var data = [
    {
        "shape": "circle",
        "x": 10,
        "y": 20,
        "lines": [
            {x1: "-10", y1: "-10", x2: "10", y2: "10"}
        ]
    },
    {
        "shape": "rect",
        "x": 30,
        "y": 20,
        "lines": [
            {x1: "-10", y1: "-10", x2: "10", y2: "10"}
        ]
    },
    {
        "shape": "circle",
        "x": 50,
        "y": 20,
        "lines": [
            {x1: "-10", y1: "-10", x2: "10", y2: "10"},
            {x1: "-10", y1: "10", x2: "10", y2: "-10"}
        ]
    },
    {
        "shape": "rect",
        "x": 70,
        "y": 20,
        "lines": [
            {x1: "-10", y1: "-10", x2: "10", y2: "10"},
            {x1: "-10", y1: "10", x2: "10", y2: "-10"}
        ]
    }
];
我知道我可以使用filter()函数来区分形状,以便创建如下形状:

var shapes = svg.selectAll(".shape")
        .data(data)
        .enter()
        .append("g")
        .attr("transform", function (d) {
            return "translate(" + d.x + "," + d.y + ")";
        });

var circles = shapes.filter(function (d) {
    return d.shape == "circle"
})
        .append("circle")
        .attr("r", 10);

var rect = shapes.filter(function (d) {
    return d.shape == "rect"
})
        .append("rect")
        .attr("transform", "translate(-5, -5)")
        .attr("width", 10)
        .attr("height", 10);
shapes.append("line")
        .attr("stroke", "red")
        .attr("x1", function (d) {
            return d.lines[0].x1
        })
        .attr("y1", function (d) {
            return d.lines[0].y1
        })
        .attr("x2", function (d) {
            return d.lines[0].x2
        })
        .attr("y2", function (d) {
            return d.lines[0].y2
        })
然后,我的问题是根据数据附加可变数量的行

我明白了我怎么可能只发生第一行这样的事:

var shapes = svg.selectAll(".shape")
        .data(data)
        .enter()
        .append("g")
        .attr("transform", function (d) {
            return "translate(" + d.x + "," + d.y + ")";
        });

var circles = shapes.filter(function (d) {
    return d.shape == "circle"
})
        .append("circle")
        .attr("r", 10);

var rect = shapes.filter(function (d) {
    return d.shape == "rect"
})
        .append("rect")
        .attr("transform", "translate(-5, -5)")
        .attr("width", 10)
        .attr("height", 10);
shapes.append("line")
        .attr("stroke", "red")
        .attr("x1", function (d) {
            return d.lines[0].x1
        })
        .attr("y1", function (d) {
            return d.lines[0].y1
        })
        .attr("x2", function (d) {
            return d.lines[0].x2
        })
        .attr("y2", function (d) {
            return d.lines[0].y2
        })
但是如果行数是可变的,我不知道该怎么办

实现这一目标的正确方法是什么


我在这里创建了一个小提琴示例:

正确的方法是使用一个。也就是说,您再次将行数据绑定到
line
元素,并引用先前绑定的数据:

shapes.selectAll("line").data(function(d) { return d.lines; })
      .enter().append("line")
然后,在设置参数时,可以直接参考坐标:

.attr("x1", function (d) {
            return d.x1
        })
        .attr("y1", function (d) {
            return d.y1
        })
        .attr("x2", function (d) {
            return d.x2
        })
        .attr("y2", function (d) {
            return d.y2
        })

完整示例。

谢谢您的回答。如果您需要访问父数据,例如,如果我想将线条笔划颜色更改为红色表示圆形,绿色表示矩形,您会怎么做?我会使此信息成为线条对象的一部分,以便有一个干净的分隔。要访问父级中的信息,可以使用.Ok很高兴知道,我还发现我可以使用d3.select(this.parentNode).datum()来获取父级数据。