[ Index ] |
PHP Cross Reference of vtigercrm-6.1.0 |
[Summary view] [Print] [Text view]
1 /** 2 * jqPlot 3 * Pure JavaScript plotting plugin using jQuery 4 * 5 * Version: 1.0.2 6 * Revision: 1108 7 * 8 * Copyright (c) 2009-2011 Chris Leonello 9 * jqPlot is currently available for use in all personal or commercial projects 10 * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL 11 * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can 12 * choose the license that best suits your project and use it accordingly. 13 * 14 * Although not required, the author would appreciate an email letting him 15 * know of any substantial use of jqPlot. You can reach the author at: 16 * chris at jqplot dot com or see http://www.jqplot.com/info.php . 17 * 18 * If you are feeling kind and generous, consider supporting the project by 19 * making a donation at: http://www.jqplot.com/donate.php . 20 * 21 * sprintf functions contained in jqplot.sprintf.js by Ash Searle: 22 * 23 * version 2007.04.27 24 * author Ash Searle 25 * http://hexmen.com/blog/2007/03/printf-sprintf/ 26 * http://hexmen.com/js/sprintf.js 27 * The author (Ash Searle) has placed this code in the public domain: 28 * "This code is unrestricted: you are free to use it however you like." 29 * 30 */ 31 (function($) { 32 33 /** 34 * Class: $.jqplot.Trendline 35 * Plugin which will automatically compute and draw trendlines for plotted data. 36 */ 37 $.jqplot.Trendline = function() { 38 // Group: Properties 39 40 // prop: show 41 // Wether or not to show the trend line. 42 this.show = $.jqplot.config.enablePlugins; 43 // prop: color 44 // CSS color spec for the trend line. 45 // By default this wil be the same color as the primary line. 46 this.color = '#666666'; 47 // prop: renderer 48 // Renderer to use to draw the trend line. 49 // The data series that is plotted may not be rendered as a line. 50 // Therefore, we use our own line renderer here to draw a trend line. 51 this.renderer = new $.jqplot.LineRenderer(); 52 // prop: rendererOptions 53 // Options to pass to the line renderer. 54 // By default, markers are not shown on trend lines. 55 this.rendererOptions = {marker:{show:false}}; 56 // prop: label 57 // Label for the trend line to use in the legend. 58 this.label = ''; 59 // prop: type 60 // Either 'exponential', 'exp', or 'linear'. 61 this.type = 'linear'; 62 // prop: shadow 63 // true or false, wether or not to show the shadow. 64 this.shadow = true; 65 // prop: markerRenderer 66 // Renderer to use to draw markers on the line. 67 // I think this is wrong. 68 this.markerRenderer = {show:false}; 69 // prop: lineWidth 70 // Width of the trend line. 71 this.lineWidth = 1.5; 72 // prop: shadowAngle 73 // Angle of the shadow on the trend line. 74 this.shadowAngle = 45; 75 // prop: shadowOffset 76 // pixel offset for each stroke of the shadow. 77 this.shadowOffset = 1.0; 78 // prop: shadowAlpha 79 // Alpha transparency of the shadow. 80 this.shadowAlpha = 0.07; 81 // prop: shadowDepth 82 // number of strokes to make of the shadow. 83 this.shadowDepth = 3; 84 this.isTrendline = true; 85 86 }; 87 88 $.jqplot.postSeriesInitHooks.push(parseTrendLineOptions); 89 $.jqplot.postDrawSeriesHooks.push(drawTrendline); 90 $.jqplot.addLegendRowHooks.push(addTrendlineLegend); 91 92 // called witin scope of the legend object 93 // current series passed in 94 // must return null or an object {label:label, color:color} 95 function addTrendlineLegend(series) { 96 var ret = null; 97 if (series.trendline && series.trendline.show) { 98 var lt = series.trendline.label.toString(); 99 if (lt) { 100 ret = {label:lt, color:series.trendline.color}; 101 } 102 } 103 return ret; 104 } 105 106 // called within scope of a series 107 function parseTrendLineOptions (target, data, seriesDefaults, options, plot) { 108 if (this._type && (this._type === 'line' || this._type == 'bar')) { 109 this.trendline = new $.jqplot.Trendline(); 110 options = options || {}; 111 $.extend(true, this.trendline, {color:this.color}, seriesDefaults.trendline, options.trendline); 112 this.trendline.renderer.init.call(this.trendline, null); 113 } 114 } 115 116 // called within scope of series object 117 function drawTrendline(sctx, options) { 118 // if we have options, merge trendline options in with precedence 119 options = $.extend(true, {}, this.trendline, options); 120 121 if (this.trendline && options.show) { 122 var fit; 123 // this.renderer.setGridData.call(this); 124 var data = options.data || this.data; 125 fit = fitData(data, this.trendline.type); 126 var gridData = options.gridData || this.renderer.makeGridData.call(this, fit.data); 127 this.trendline.renderer.draw.call(this.trendline, sctx, gridData, {showLine:true, shadow:this.trendline.shadow}); 128 } 129 } 130 131 function regression(x, y, typ) { 132 var type = (typ == null) ? 'linear' : typ; 133 var N = x.length; 134 var slope; 135 var intercept; 136 var SX = 0; 137 var SY = 0; 138 var SXX = 0; 139 var SXY = 0; 140 var SYY = 0; 141 var Y = []; 142 var X = []; 143 144 if (type == 'linear') { 145 X = x; 146 Y = y; 147 } 148 else if (type == 'exp' || type == 'exponential') { 149 for ( var i=0; i<y.length; i++) { 150 // ignore points <= 0, log undefined. 151 if (y[i] <= 0) { 152 N--; 153 } 154 else { 155 X.push(x[i]); 156 Y.push(Math.log(y[i])); 157 } 158 } 159 } 160 161 for ( var i = 0; i < N; i++) { 162 SX = SX + X[i]; 163 SY = SY + Y[i]; 164 SXY = SXY + X[i]* Y[i]; 165 SXX = SXX + X[i]* X[i]; 166 SYY = SYY + Y[i]* Y[i]; 167 } 168 169 slope = (N*SXY - SX*SY)/(N*SXX - SX*SX); 170 intercept = (SY - slope*SX)/N; 171 172 return [slope, intercept]; 173 } 174 175 function linearRegression(X,Y) { 176 var ret; 177 ret = regression(X,Y,'linear'); 178 return [ret[0],ret[1]]; 179 } 180 181 function expRegression(X,Y) { 182 var ret; 183 var x = X; 184 var y = Y; 185 ret = regression(x, y,'exp'); 186 var base = Math.exp(ret[0]); 187 var coeff = Math.exp(ret[1]); 188 return [base, coeff]; 189 } 190 191 function fitData(data, typ) { 192 var type = (typ == null) ? 'linear' : typ; 193 var ret; 194 var res; 195 var x = []; 196 var y = []; 197 var ypred = []; 198 199 for (i=0; i<data.length; i++){ 200 if (data[i] != null && data[i][0] != null && data[i][1] != null) { 201 x.push(data[i][0]); 202 y.push(data[i][1]); 203 } 204 } 205 206 if (type == 'linear') { 207 ret = linearRegression(x,y); 208 for ( var i=0; i<x.length; i++){ 209 res = ret[0]*x[i] + ret[1]; 210 ypred.push([x[i], res]); 211 } 212 } 213 else if (type == 'exp' || type == 'exponential') { 214 ret = expRegression(x,y); 215 for ( var i=0; i<x.length; i++){ 216 res = ret[1]*Math.pow(ret[0],x[i]); 217 ypred.push([x[i], res]); 218 } 219 } 220 return {data: ypred, slope: ret[0], intercept: ret[1]}; 221 } 222 223 })(jQuery);
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:08:37 2014 | Cross-referenced by PHPXref 0.7.1 |