无法创建SVG组

时间:2016-02-27 16:27:09

标签: d3.js

使用d3.js,我尝试创建一系列SVG组(即<g>个元素),并为数据数组中的每个数字添加<g>元素。每个<g>元素本身应包含<rect><text>。以下代码在我看来应该这样做,但当我检查<svg>元素(在Chrome和Firefox中)时,它直接包含<rect>个元素和<text>元素{1}}元素,看不到<svg>元素。

HTML页面最初只包含一个空的<g>元素。 <svg>只是一个简单的数字数组。

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

svg.selectAll("g")
    .data(dataset)
    .enter()
    .call( function(g) {
        g.append("rect")
            .attr("x", (d, i) => xScale(i))
            .attr("y", d => h - yScale(d))
            .attr("width", xScale.rangeBand())
            .attr("height", d => yScale(d))
            .attr("fill", d => "rgb(0,0," + (d*10) + ")")
            .on('click', d => console.log(d))
            .on('mouseover', function() {
                d3.select(this)
                    .attr('fill', 'orange');
                })
            .on('mouseout', function(d) {
                d3.select(this)
                    .transition()
                    .duration(250)
                    .attr("fill", d => "rgb(0,0," + (d*10) + ")")
                });
        })
    .call( function(g) {
        g.append('text')
            .text(d => d)
            .attr('class','label')
            .attr("x", (d, i) => xScale(i) + xScale.rangeBand() / 2)
            .attr("y", d =>  h - yScale(d) + 14);
        });

1 个答案:

答案 0 :(得分:1)

我发现了我的问题。我认为selectAll('g').data(dataset).enter()会导致<g>元素与我创建的dataset中的数据不匹配。但它们不是,并且在调用.append('g')之后添加.enter()以实际创建缺少的<g>元素是必要的。之后,.call(...)调用的函数将传递新的<g>元素。