NVD3累积折线图显示错误的y值

时间:2014-10-08 14:51:24

标签: javascript d3.js nvd3.js

我已将折线图转换为累积折线图,但其y值未正确显示。 y轴的范围应为80.00 - 140.00,但我得到-0.08 - 0.20。有没有人设法调整下面的规范化代码,使其适用于各种范围?

 line.values = line.values.map(function(point, pointIndex) {

   point.display = {
     'y': (lines.y()(point, pointIndex) - v) / (1 + v)
   };
   return point;

 })

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我知道这个问题有些陈旧,但我确信累积折线图的规范化代码在概念上并不正确。此外,NVD3累积折线图实现实际上是一个索引图表实现(see Mike Bostock's example)。我认为,累积折线图更像this。使用NVD3折线图和对基础数据的一些快速修改,可以轻松实现累积图表。

如果我们认为Bostock是正确的,并且我们确实希望获得索引折线图,那么NVD3中的indexify函数应该更改为:

/* Normalize the data according to an index point. */
function indexify(idx, data) {
    if (!indexifyYGetter) indexifyYGetter = lines.y();
    return data.map(function(line, i) {
        if (!line.values) {
            return line;
        }
        var indexValue = line.values[idx];
        if (indexValue == null) {
            return line;
        }
        var v = indexifyYGetter(indexValue, idx);

        // TODO: implement check below, and disable series if series
        // causes a divide by 0 issue
        if ((Math.abs(v) < 1e-6) && !noErrorCheck) {
            // P.S. You may have to set a higher threshold (~1e-6?).
            // I don't know I didn't run any tests...
            line.tempDisabled = true;
            return line;
        }

        line.tempDisabled = false;

        line.values = line.values.map(function(point, pointIndex) {
            point.display = {
                'y': (indexifyYGetter(point, pointIndex) - v) / v
            };
            return point;
        });

        return line;
    })
}

我向NVD3的作者询问related question并计划提交拉取请求。 请注意,百分比变化图表仅在所有基础数​​据均为正数时才有意义。当您开始将负值投入混合时,百分比变化会失去其所有含义。

答案 1 :(得分:0)

我发现的工作是在点序列的开头插入y值为0的另一个点。

给出[[x1,y1],[x2,y2],... [xn,yn]]]形式的数据点列表, 像values.upshift([0,0])这样的东西适用于我(x值是任意的,但我只是使用0或值[0] [0])来插入列表的前面。

(我对该图表的看法与此相同。我仍然在研究它,但我希望这有所帮助。)