javascript - 排序水平条形图 D3js

标签 javascript sorting d3.js graph bar-chart

我有以下数据集:

FrequencyData = [
              {label:"QWERTY", value:0},
              {label:"AZERTY", value:14},
              {label:"AAAAAA", value:20},
              {label:"BBBBBB", value:30},
              {label:"CCCCCC", value:40},
              {label:"DDDDDDD", value:45},
              {label:"EEEEEE", value:21},
          ];

以及基于此数据集绘制水平条形图的代码:

function createBarChart(dataset) {

              $elem[0].svg = null;

              var margin = {top: 20, right: 10, bottom: 120, left: 10},
                  width = $elem[0].parentNode.clientWidth - margin.left - margin.right,
                  height = $elem[0].parentNode.clientHeight - margin.top - margin.bottom;

              var mappedDataset = dataset.map(function(d) { return d.value; });

              var div = d3.select($elem[0]).append("div").attr("class", "toolTip");
              var formatPercent = d3.format("");

              var y = d3.scale.ordinal()
                //.domain(mappedDataset.sort(function(a, b) { return mappedDataset[a] - mappedDataset[b]; }))
                .domain(dataset.map(function(d) { return d.label; }))
                .rangeRoundBands([0, height], 0.1, 0.3);
              var x = d3.scale.linear()
                .domain([0, d3.max(dataset, function(d) { return d.value; })])
                .range([0, width]);

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

              d3.select($elem[0]).selectAll("svg").remove()

              var svg = d3.select($elem[0]).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.append("g")
                      .attr("class", "x axis")
                      .attr("transform", "translate(0," + height + ")")
                      .call(xAxis);

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

              svg.select(".y.axis").remove();
              svg.select(".x.axis").remove();

              svg.append("g")
                      .append("text")
                      .attr("transform", "rotate(0)")
                      .attr("x", 170)
                      .attr("dx", ".1em")
                      .style("text-anchor", "end")
                      .text("Frequency of Visit/Time Spent (mins)");
                      //console.log(dataset);

              var bar = svg.selectAll(".bar")
                        .data(dataset, function(d) { return d.label; })

              // new data:
              bar.enter().append("rect")
                      .attr("class", "bar")
                      .attr("x", function(d) { return 0; })
                      .attr("y", function(d) { return y(d.label); })
                      .attr("width", function(d) { return x(d.value); }) // return 0 if want to animate
                      .attr("height", y.rangeBand())
                      .text(function(d) { return d.label; });

              svg.selectAll(".bartext")
                      .data(dataset, function(d) { return d.label; })
                      .enter()
                      .append("text")
                      .attr("class", "bartext")
                      .attr("text-anchor", "middle")
                      .attr("fill", "white")
                      .attr("x", function(d,i) {
                          if (d.value==0) {return x(d.value)+50;}
                          return x(d.value)/2;
                      })
                      .attr("y", function(d,i) {
                          //if (d.value==0){return};
                          return y(d.label)+15;
                      })
                      .text(function(d){
                        //if (d.value==0){return};
                           return d.label;
                      });


              bar.on("mousemove", function(d){
                      if ( in_transition ) { return; }
                      div.style("left", d3.event.pageX+"px");
                      div.style("top", d3.event.pageY-130+"px");
                      div.style("display", "inline-block");
                      div.html((d.value)+"%");
                  });
              bar.on("mouseout", function(d){
                      if ( in_transition ) { return; }
                      div.style("display", "none");
                  });

              // removed data:
              bar.exit().remove();



              $elem[0].svg = svg;

            }, delay);

          }

这里的问题是我想让条按降序排序,但当时它们是未排序的。问题似乎是因为 Y 轴使用标签作为域,但如果我将其更改为值,图表就会出现错误并且不会显示我想要的内容。

此外,我尝试了一些 d3 排序函数(在此代码段中显示,也在上面的代码中显示):

mappedDataset.sort(function(a, b) { return mappedDataset[a] - mappedDataset[b]; }))

但显然没有对任何东西进行排序。有任何想法吗?谢谢。

最佳答案

这应该可以解决问题:

console.log(dataset);
dataset = dataset.sort(function(a, b) {
    return a.value - b.value;
}).reverse();
console.log(dataset);

这是一个带有代码的 jsFiddle:

https://jsfiddle.net/7xv7rcbv/

关于javascript - 排序水平条形图 D3js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37554101/

相关文章:

python - 如何在 Python 中手动对数字列表进行排序?

javascript - 在 crossfilter.js 中按多个维度排序

javascript - d3.js 带圆圈的实时折线图

javascript - 支持矢量图层的基于图 block 的 map 解决方案

javascript - 如何使用 d3 将多个 svgs 附加到正文,每个 svgs 都有一个 id?

javascript - if-else 在 JavaScript 中不起作用

Javascript JSON 变量父级

javascript - Backbone.js - 模型 URL 与集合 URL

javascript - 手机间隙 : Asynchronous calls in javascript or native code?

sorting - 希尔排序的最坏情况 : Θ(N^3/2) or O((NlogN)^2)?