如何创建多个d3多边形

时间:2013-05-20 17:30:09

标签: javascript d3.js

我在发布这个问题时稍微编辑了这个问题。这是新代码: 这是我的代码:

        var elementTags = ["Google", 4, "Wikipedia", "Yahoo!", "Cindy"];
        var _s32 = (Math.sqrt(3)/2);
        var A = 75;
        var _counter = 0;
        var xDiff;
        var yDiff;
        var pointData = [[A+xDiff, 0+yDiff], [A/2+xDiff, (A*_s32)+yDiff], [-A/2+xDiff, (A*_s32)+yDiff], [-A+xDiff, 0+yDiff],
        [-A/2+xDiff, -(A*_s32)+yDiff], [A/2+xDiff, -(A*_s32)+yDiff], [A+xDiff, 0+yDiff]];
        var svgContainer = d3.select("body") //create container
                .append("svg")
                .attr("width", 1000)
                .attr("height", 1000);

        var enterElements = svgContainer.selectAll("path.area") //draw elements
                .data([pointData]).enter().append("path")
                .style("fill", "#ff0000")
                .attr("d", d3.svg.area());

我想要做的是为每个elementTags值创建一个新的六边形。每个新的六边形应该有一个随机的xDiff和yDiff,每次_counter的值应该增加1。

2 个答案:

答案 0 :(得分:1)

你需要使用循环。这是修改后的代码:

var elementTags = ["Google", 4, "Wikipedia", "Yahoo!", "Cindy"];
var _s32 = (Math.sqrt(3)/2);
var A = 75;

var svgContainer = d3.select("body") //create container
        .append("svg")
        .attr("width", 1000)
        .attr("height", 1000);

for (index = 0; index < elementTags.length; index++) {
    var xDiff = Math.random()*100+100;
    var yDiff = Math.random()*100+100;
    var pointData = [
        [A+xDiff, 0+yDiff]
        , [A/2+xDiff, (A*_s32)+yDiff]
        , [-A/2+xDiff, (A*_s32)+yDiff]
        , [-A+xDiff, 0+yDiff]
        , [-A/2+xDiff, -(A*_s32)+yDiff]
        , [A/2+xDiff, -(A*_s32)+yDiff]
        , [A+xDiff, 0+yDiff]
    ];

    var enterElements = svgContainer.selectAll("path.area") //draw element
        .data([pointData]).enter().append("path")
        .style("fill", "#ff0000")
        .attr("d", d3.svg.area());
}

它正在做你想要的吗?

答案 1 :(得分:0)

我有类似的情况,在this question中描述。我把一个代码示例放在一起,你可以在这里找到: http://bl.ocks.org/explunit/4659227

关键思想是在每个数据点的追加期间可以调用路径生成函数:

svg.selectAll("path")
  .data(nodes).enter().append("svg:path")
  .attr("d", function(d) { return flow_shapes[d.NodeType](d.height, d.width);})

很难从你的代码中看出来,但看起来你可能试图在一个循环中调用.append而不是构建你的数据,然后让D3在一个语句中添加所有的注释。

将完整的代码放在JSFiddle中可能对您有所帮助,这样我们就可以看到您正在尝试的所有内容。