C3.js“未捕获错误:源数据缺少(1,844)处的组件!”

时间:2015-10-04 17:58:13

标签: javascript node.js plot electron c3.js

我使用C3.js和Electron(Atom Shell)制作用于数据可视化的桌面应用程序。我无法将数据输入C3。我有一个包含所有坐标的DataArray:DataAray = [[x1,y1],[x2,y2],[x3,y3],...]。 我使用以下代码将其分解为xData数组和yData数组:

xData = [];
yData=[];
xData.push('data1_x');
yData.push('data1');
for (var i = 0; i < DataArray.length ; i++){
         xData.push (DataArray[i][0]);
         yData.push (DataArray[i][1]);
                }
var chart = c3.generate({
            bindto: '#chart',
            data: {
                xs: {
                    data1: 'data1_x',

                },
              columns: [
                        x,
                        y
                          ],
                type: 'scatter'
                        }
                    });

但是当我运行应用程序时,我收到此错误: “未捕获错误:源数据缺少(1,844)处的组件!”,来源:PATH / To / c3-0.4.10 / c3.min.js(2)

并且根本没有绘制图表。如果我将for循环更改为

for (var i = 0; i < 843 ; i++)

然而,它确实绘制了图表。 之前我正在使用Plotly,我曾经运行完全相同的代码为Plotly准备数据,并且它运行得很好。这里有什么问题?还有,有没有办法要求C3忽略数据中的错误?例如,如果其中一个点有空,那么C3是否有办法绘制图形?

3 个答案:

答案 0 :(得分:1)

我不知道是否有办法配置C3以忽略null或未定义的值。尝试忽略null / undefined值,以便C3可以绘制图形。

for (var i = 0; i < DataArray.length ; i++) {
     // if the value is not undefined or null, push to array
     if (DataArray[i][0] !== undefined && DataArray[i][0] !== null) {
         xData.push (DataArray[i][0]);
     } else {
         // push 0 to signify no data
         xData.push(0);
     }
     ...
}

答案 1 :(得分:0)

C3将忽略空值。但是,当未定义值时,您将收到此错误。 TonalLynx的答案将有效。或者您可以将未定义的值更改为null。

for (var i = 0; i < DataArray.length ; i++) {
 // if the value is undefined, push null to array
 if (DataArray[i][0] === undefined) {
     xData.push (null);
 } else {
     xData.push (DataArray[i][0]);
 }
 ...
}

答案 2 :(得分:0)

c3有一个内部功能可以帮助你做到这一点

class SomeClass(object):
    class _List(list):
        def __init__(self, owner, *args, **kwargs):
            super(SomeClass._List, self).__init__(*args, **kwargs)
            self.owner = owner

        def __setitem__(self, index, value):
            super(SomeClass._List, self).__setitem__(index, value)
            self.owner.listsquare[index] = int(value**2)

    def __init__(self, n):
        self.list = SomeClass._List(self, range(0, n))

    @property
    def list(self):
        return self._list
    @list.setter
    def list(self, val):
        self._list = val
        self._listsquare = [x**2 for x in self._list ]

    @property
    def listsquare(self):
        return self._listsquare
    @listsquare.setter
    def listsquare(self, val):
        self.list = [int(pow(x, 0.5)) for x in val]

c = SomeClass(5)
print(c.list)        # --> [0, 1, 2, 3, 4]
print(c.listsquare)  # --> [0, 1, 4, 9, 16]
c.list[0] = 5
print(c.list)        # --> [5, 1, 2, 3, 4]
print(c.listsquare)  # --> [25, 1, 4, 9, 16]