【问题标题】:nvd3 stacked area chart looks glitchy how to fix?nvd3堆积面积图看起来有问题如何解决?
【发布时间】:2014-01-28 20:59:30
【问题描述】:

我的堆积面积图是这样的:

我使用的数据具有相同数量的值,就像在示例中一样。我使用的数据位于:http://pastebin.com/D07hja76

我使用的代码也几乎与选择器相似:

var colors = d3.scale.category20();
keyColor = function(d, i) {return colors(d.key)};

nv.addGraph(function() {
  chart = nv.models.stackedAreaChart()
                .useInteractiveGuideline(true)
                .x(function(d) { return d.t })
                .y(function(d) { return d.v })
                .color(keyColor)
                .transitionDuration(300)

  chart.xAxis
    .tickFormat(function(d) { return d3.time.format('%x')(new Date(d)) });

  chart.yAxis
    .tickFormat(d3.format(',.0f'));

  d3.select('#browserBreakdown')
    .datum(browserchartdata)
    .transition().duration(500)
    .call(chart)
    .each('start', function() {
        setTimeout(function() {
            d3.selectAll('#browserBreakdown *').each(function() {
              if(this.__transition__)
                this.__transition__.duration = 1;
            })
          }, 0)
      })

  nv.utils.windowResize(chart.update);

  return chart;
});

如何让图表看起来正确?

【问题讨论】:

  • 我很确定问题只是您的数据没有排序,因此路径在自身之上来回跳跃。我想弄清楚如何告诉 NVD3 对数据进行排序,然后我会发布一个完整的答案。

标签: charts d3.js nvd3.js stacked-area-chart


【解决方案1】:

NVD3 图表不会将您的数据点沿 x 轴按从左到右的顺序排序,因此您会得到奇怪的交叉形状。

我认为有一些方法可以告诉 NVD3 对数据进行排序,但他们几乎没有文档,我无法快速弄清楚。相反,您可以在将数据添加到图表之前使用此函数对数据进行排序:

   data.forEach(function(d,i){ 

      d.values = d.values.sort(
          function(a,b){
             return +a.t -b.t;
          }
      );
   });

这是如何工作的:

  • data 是 JSON 文件中的对象数组(您可以使用 browserchartdata);

  • Javascript Array.forEach(function(){}) 方法为数组的每个元素调用传入的函数,并将数组元素及其索引传递给该函数;

  • Javascript Array.sort() 方法使用传入的函数创建一个排序后的数组版本,以确定两个元素(ab)如何比较;

  • 我创建的排序函数使用数组中每个元素的.t 变量(用于x 轴)来确定a 是否大于b(因此应该在排序后的数组中跟随它);

  • 我在每个数据行的values数组上调用这个排序函数,然后覆盖未排序的values数组,这样data中的对象都以它们的值排序结束根据t,从最小到最大。

我在 NVD3 的“实时代码”网站上使用您的数据进行了尝试,它看起来不错。

【讨论】:

  • 太棒了!!我有这个想法,但我确信 nvd3 自己对所有内容进行了排序!非常感谢您提供了详尽而详细的答案。
  • 不需要赋值 - Array.prototype.sort 将就地对数组进行排序。
猜你喜欢
  • 2014-08-12
  • 2014-03-21
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多