Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 预览d3条形图,使其按每个x值的值排序_Javascript_Sorting_D3.js_Nvd3.js - Fatal编程技术网

Javascript 预览d3条形图,使其按每个x值的值排序

Javascript 预览d3条形图,使其按每个x值的值排序,javascript,sorting,d3.js,nvd3.js,Javascript,Sorting,D3.js,Nvd3.js,我用以下数据创建了一个nvd3组条形图 风险值数据=[{ 关键:小君, 价值观:[ {x:2013,y:200}, {x:2014,y:352}, {x:2015,y:1100}, {x:2016,y:120} ] }, { 关键字:七月, 价值观:[ {x:2013,y:200}, {x:2014,y:862}, {x:2015,y:124}, {x:2016,y:500} ] }, { 关键词:三月, 价值观:[ {x:2013,y:578}, {x:2014,y:964}, {x:201

我用以下数据创建了一个nvd3组条形图

风险值数据=[{ 关键:小君, 价值观:[ {x:2013,y:200}, {x:2014,y:352}, {x:2015,y:1100}, {x:2016,y:120} ] }, { 关键字:七月, 价值观:[ {x:2013,y:200}, {x:2014,y:862}, {x:2015,y:124}, {x:2016,y:500} ] }, { 关键词:三月, 价值观:[ {x:2013,y:578}, {x:2014,y:964}, {x:2015,y:788}, {x:2016,y:152} ] }, { 关键字:JAN, 价值观:[ {x:2013,y:20}, {x:2014,y:485}, {x:2015,y:258}, {x:2016,y:900} ] }]; nv.addGraphfunction{ var图表=nv.models.multiBarChart; chart.xAxis.tickFormatd3.format',f'; chart.yAxis.tickFormatd3.format',.1f'; d3.选择“图表svg” .datumdata .过渡期 .呼叫图; nv.utils.windowResizechart.update; 收益表; }; 图表svg{ 高度:400px; }
您可能希望重写该类。这就是绘制条形图的地方

看起来每个月都有自己的组,并且它们被堆叠在一起。每个分组之间都有一个边距

您需要按y值对每个组进行排序,并更改x位置的水平边距

组偏移量由:xgetXd,i确定

如果可以对数据进行排序,则可以更改这些值

可以使用以下方法转换数据。这可在条形图布局函数内用于参考索引位置

function sortGroupedData(data) {
  var groups = {};
  for (var m = 0; m < data.length; m++) {
    var subset = data[m];
    for (var y = 0; y < subset.values.length; y++) {
      var point = subset.values[y],
          tuples = groups[point.x] || [];
      tuples.push([subset.key, point.y, m]);
      groups[point.x] = tuples;
    }
  }
  Object.keys(groups).forEach(function(key) {
    groups[key].sort(function(a, b) {
      return a[1] - b[1];
    });
  });
  return groups;
}
所需的代码更改 最终工作演示 免责声明:这不适用于堆叠,我会在有机会时修复它。这只解决了用户的直接问题

堆叠 在写出SVG的y位置之前,d.y1值是预先确定的。我们需要重新计算数据中每个项目的y1底部位置

if (stacked) {
  barSelection
    .attr('y', function(d, i, j) {
      var yVal = 0;
      if (!data[j].nonStackable) {
        yVal = y(d.y1); // Already determined...

如果不包含生成图表的代码,很难以有意义的方式回答这个问题
function sortGroupedData(data) {
  var groups = {};
  for (var m = 0; m < data.length; m++) {
    var subset = data[m];
    for (var y = 0; y < subset.values.length; y++) {
      var point = subset.values[y],
          tuples = groups[point.x] || [];
      tuples.push([subset.key, point.y, m]);
      groups[point.x] = tuples;
    }
  }
  Object.keys(groups).forEach(function(key) {
    groups[key].sort(function(a, b) {
      return a[1] - b[1];
    });
  });
  return groups;
}
{
  "2013" : [
    ["JAN", 20,  3],
    ["JUN", 200, 0],
    ["JUL", 200, 1],
    ["MAR", 578, 2]
  ],
  "2014" : [
    ["JUN", 352, 0],
    ["JAN", 485, 3],
    ["JUL", 862, 1],
    ["MAR", 964, 2]
  ],
  "2015" : [
    ["JUL", 124,  1],
    ["JAN", 258,  3],
    ["MAR", 788,  2],
    ["JUN", 1100, 0]
  ],
  "2016" : [
    ["JUN", 120, 0],
    ["MAR", 152, 2],
    ["JUL", 500, 1],
    ["JAN", 900, 3]
  ]
}
nv.models.multiBar = function() {
  // ...
  function chart(selection) {
    // ...
    selection.each(function(data) {
      var dataMap = sortGroupedData(data);
      // ...
      else {
        barSelection
          .attr('x', function(d,i) {
            var pos = dataMap[d.x].map((val, idx) => val[0] === d.key ? idx : -1).filter(x => x > -1)[0];
            return pos * x.rangeBand() / data.length;
          })
        // ...
if (stacked) {
  barSelection
    .attr('y', function(d, i, j) {
      var yVal = 0;
      if (!data[j].nonStackable) {
        yVal = y(d.y1); // Already determined...