d3js刷了如何获取选择值

问题描述 投票:0回答:1

我在d3js v4中有日期叠加条形图,我想添加画笔选择功能。

我无法从d3.event.selection获取x值。它显示TypeError: x.invert is not a function错误。为什么?我正在使用example的刷码。我想念任何特殊图书馆吗?

这是我的代码的一部分。底部是最重要的部分:D:

 var x = d3.scaleBand().range([0, width]).padding(0.1);
        var y = d3.scaleLinear().range([height, 0]);
        var z = d3.scaleOrdinal().range(['#d53e4f', '#fc8d59', '#fee08b', '#ffffbf', '#e6f598', '#99d594', '#3288bd']);

        x.domain(data.map(function (d) {
            return parseDate(d.time);
        }));

        y.domain([0, d3.max(data, function (d) {
            return d.sum;
        })]);
        z.domain(data.map(function (d) {
            return d.keys;
        }));


   var stack = d3.stack()
            .keys(keys)
            .order(d3.stackOrderNone)
            .offset(d3.stackOffsetNone);

        var layers = stack(data);

        var layer = g.selectAll(".layer")
            .data(layers)
            .enter().append("g")
            .attr("class", "layer");

         layer.selectAll("rect")
            .data(function (d) {
                return d;
            })
            .enter().append("rect")
            .attr('class', 'barStacked')
            .attr("x", function (d) {
                return x(parseDate(d.data.time));
            })
            .attr("y", function (d) {
                return y(d[1]);
            })
            .attr("height", function (d) {
                return y(d[0]) - y(d[1]);
            })
            .attr("width", x.bandwidth());

     g.append("g")
            .attr("class", "axis axis--x")
            .attr("transform", "translate(0," + (height + 5) + ")")
            .call(xAxis);

        g.append("g")
            .attr("class", "axis axis--y")
            .attr("transform", "translate(0,0)")
            .call(yAxis);


       g.append("g")
            .attr("class", "brush")
            .call(d3.brushX()
                .extent([[0, 0], [width, height]])
                .on("end", brushended));

        function brushended() {
          if (!d3.event.sourceEvent) return; // Only transition after input.
          if (!d3.event.selection) return; // Ignore empty selections.
            var extent = d3.event.selection;
             console.log(x.domain([ x.invert(extent[0]), x.invert(extent[1]) 
    ]));

        }
    }
d3.js brush
1个回答
0
投票

正如安德鲁所说,scaleBand没有反转方法。链接中的示例是连续(时间)标度,其具有反转方法(here)。

如果您的scaleBand实际上代表一个连续的时间尺度,一个解决方案是创建一个额外的比例(scaleTime),其范围与您的比例'x'相同,然后使用它的反转方法。在指定域时,您需要小心分配带宽和填充,以使其等效于“x”。

© www.soinside.com 2019 - 2024. All rights reserved.