定义了绘制函数以便重用,但这是独立的语句。

draw(circles);


有没有办法将绘图功能放回D3的功能链中(重写)?

svg.selectAll("circle")
            .data(dataset)
            .enter()
            .append("circle")
            .draw(???) //not work.


这是代码。工作版本为here

<body>
    <script type="text/javascript">

        var draw = function (circles) {
            circles.attr("cx", function (d, i) {
                return (i * 50) + 25;
            })
         .attr("cy", h / 2)
         .attr("r", function (d) {
            return d;
         });
        };

        var w = 500, h = 50;

        var dataset = [5, 10, 15, 20, 25];
        var dataset2 = [25, 20, 15, 10, 5];

        var svg = d3.select("body")
                    .append("svg")
                    .attr("width", w)
                    .attr("height", h);

        var circles = svg.selectAll("circle")
            .data(dataset)
            .enter()
            .append("circle")

        draw(circles);

        var circles2 = svg.selectAll("circle")
        .data(dataset2)
        .transition()
        .duration(2000);

        draw(circles2);

    </script>
</body>

最佳答案

在draw()中使用call()+ this。
工作版本为here

var draw = function () {
    this.attr("cx", function (d, i) {
        return (i * 50) + 25;
    })
    .attr("cy", h / 2)
    .attr("r", function (d) {
        return d;
    });
};

circles
.data(dataset)
.enter()
.append("circle")
.call(draw)
.data(dataset2)
.transition()
.attr("fill", "red")
.duration(2000)
.call(draw);

10-04 22:41