通过添加一个空数据集来更新您的图表定义:
{
label: "Trend 1",
borderColor: 'rgba(200,0,0)',
backgroundColor: 'rgba(200,0,0)',
data: [],
fill: false,
}
在您的图表定义之后(在 jsfiddle 中)添加以下行:
arrayForRegression= []; // Declare the array which will contains calculated point of trend line
for (i=0; i < ChartVisits.data.datasets[0].data.length; i++) {
arrayForRegression.push([i, ChartVisits.data.datasets[0].data[i]]); // Fill the array with the "y" values to be approximated by regression
}
regr = regression("polynomial", arrayForRegression, 2); // Calculare polynomial regression
convertedRegressionArray = []; // Declare an array to hold the regression line in charts.js format
for (i=0; i < ChartVisits.data.datasets[0].data.length; i++) { // Fill the array with calculated values
convertedRegressionArray.push(regr.points[i][1]);
}
ChartVisits.config.data.datasets[2].data = convertedRegressionArray; // Put the regression array, converted to charts format, into chart
ChartVisits.update();
在您的 HTML 中,在 BODY SECTION 中添加这一行以包含库:
<script type="text/javascript" src="js/regression.min.js"></script>
库来自:
https://bl.ocks.org/daluu/5bb59ef3f3fed3de227535da367649ba
https://gist.github.com/daluu/5bb59ef3f3fed3de227535da367649ba
函数的代码被混淆/缩小,反正调用语法是:
var linReg = regression('linear', data);
var polyReg = regression('polynomial', data, 2);
var expoReg = regression('exponential', data);
var powReg = regression('power', data);
var logReg = regression('logarithmic', data);
数据格式:
var data = [[500,2.5], [1000,3], [1500,3], [2000,3.3], [3000,3.6], [4000,4], [5500,4.8], [6000,5], [7000,5], [8000,5.5], [9000,6], [12000,7], [14000,8], [15000,8], [18000,9], [20000,10], [21000,10], [24000,11], [28000,12], [30000,13], [50000,18]];
但我不确切知道如何在charts.js 或任何其他库中实现它。
这个发现让我去寻找“javascript regression.min.js”,找到了很多资源。
注意:index.html 中有错误:
<script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>
应该是:
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
注意2:
我认为线性回归部分存在一个重大错误:返回的 方程 对象(系数数组)与多项式格式相反。
例子:
3x^2+2x+1 以数组 [1, 2, 3] 的形式返回,因此每个系数必须乘以 Math.pow(x, 数组位置):
y = equation[0] * Math.pow(x,0) + equation[1] * Math.pow(x,1) + equation[1] * Math.pow(x,1) ** correct **
2x + 1 应该返回为数组 [1,2] 但它返回为 [2,1] --> bug?
y = equation[0] * Math.pow(x,1) + equation[1] * Math.pow(x,0)