javascript - 在 D3 中对条形图进行排序

标签 javascript sorting d3.js bar-chart

我在 D3 中创建了一个条形图,我尝试在单击时按升序对条形图中的条形进行排序,再次单击时按降序排序。我在代码片段末尾添加了用于排序的必要代码,但单击时没有任何反应(条形图不排序)。不确定我在这里缺少什么,任何帮助将不胜感激!

    <script>

    var margin = {top: 40, right: 20, bottom: 30, left: 40},
        width = 960 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom;

    var formatPercent = d3.format(".0%");

    var x = d3.scale.ordinal()
        .rangeRoundBands([0, width], .1);

    var y = d3.scale.linear()
        .range([height, 0]);

    var xAxis = d3.svg.axis()
        .scale(x)
        .orient("bottom");

    var yAxis = d3.svg.axis()
        .scale(y)
        .orient("left")
        .tickFormat(formatPercent);

    var tip = d3.tip()
      .attr('class', 'd3-tip')
      .offset([-10, 0])
      .html(function(d) {
        return "<strong>Frequency:</strong> <span style='color:red'>" + d.frequency + "</span>";
      })

    var svg = d3.select("body").append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
      .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

    svg.call(tip);

    d3.tsv("data/bar-graph-tooltips.tsv", type, function(error, data) {
      x.domain(data.map(function(d) { return d.letter; }));
      y.domain([0, d3.max(data, function(d) { return d.frequency; })]);

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

      svg.append("g")
          .attr("class", "y axis")
          .call(yAxis)
        .append("text")
          .attr("transform", "rotate(-90)")
          .attr("y", 6)
          .attr("dy", ".71em")
          .style("text-anchor", "end")
          .text("Frequency");

      svg.selectAll(".bar")
          .data(data)
        .enter().append("rect")
          .attr("class", "bar")
          .attr("x", function(d) { return x(d.letter); })
          .attr("width", x.rangeBand())
          .attr("y", function(d) { return y(d.frequency); })
          .attr("height", function(d) { return height - y(d.frequency); })
          .on('mouseover', tip.show)
          .on('mouseout', tip.hide)
          .on("click", function() {sortBars();});

          //Define sort order flag
        var sortOrder = false;

        //Define sort function
        var sortBars = function() {

            //Flip value of sortOrder
            sortOrder = !sortOrder;

            svg.selectAll("rect")
               .sort(function(a, b) {
                    if (sortOrder) {
                        return d3.ascending(a, b);
                    } else {
                        return d3.descending(a, b);
                    }
                })
               .transition()
               .delay(function(d, i) {
                   return i * 50;
               })
               .duration(1000)
               .attr("x", function(d, i) {
                    return xScale(i);
               });

        };          
    });


    function type(d) {
      d.frequency = +d.frequency;
      return d;
    }

    </script>

最佳答案

需要在a,b中设置需要排序的值,这里:

.sort(function(a, b) {
                if (sortOrder) {
                    return d3.ascending(a, b);
                } else {
                    return d3.descending(a, b);
                }

类似于:a.value, b.value 但这取决于您的 tsv 的结构

关于javascript - 在 D3 中对条形图进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25190556/

相关文章:

javascript - 过滤我的数据导致 y 轴搞砸了

javascript - .ease(d3.easeLinear) 产生无法读取未定义的属性 'indexOf'

javascript - 为什么 javascript 可以在我的索尼爱立信 C510 浏览器上运行,但 javascript + jquery 却不能运行?

javascript - D3 过渡中断重绘

javascript - D3 在 SVG 上拖动 "Path"定义 d.x 时元素会中断,隐藏数据?

jquery tablesorter ajax表只按一个方向排序

javascript - 如何在 express.js 中呈现 redis 记录?

javascript - 在 head 中加载 modernizr 但在 require.js 中使用它

algorithm - 按年龄对一组人进行排序的最快方法是什么?

javascript - 如何比较数组中的每个数字? (javascript)