X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-canvas.js;h=b83e54a5af9c621bd976ca9f5c5aa18cb6d45af3;hb=d1278ac992ffcd1186df7e928fa96b32812a4faf;hp=a84800188d9bc772ba125a7a5e8982448a555f24;hpb=8b7a0cc362636c7fd76e55f32e74b808886936d0;p=dygraphs.git diff --git a/dygraph-canvas.js b/dygraph-canvas.js index a848001..b83e54a 100644 --- a/dygraph-canvas.js +++ b/dygraph-canvas.js @@ -37,14 +37,19 @@ DygraphLayout.prototype.evaluate = function() { DygraphLayout.prototype._evaluateLimits = function() { this.minxval = this.maxxval = null; - for (var name in this.datasets) { - if (!this.datasets.hasOwnProperty(name)) continue; - var series = this.datasets[name]; - var x1 = series[0][0]; - if (!this.minxval || x1 < this.minxval) this.minxval = x1; - - var x2 = series[series.length - 1][0]; - if (!this.maxxval || x2 > this.maxxval) this.maxxval = x2; + if (this.options.dateWindow) { + this.minxval = this.options.dateWindow[0]; + this.maxxval = this.options.dateWindow[1]; + } else { + for (var name in this.datasets) { + if (!this.datasets.hasOwnProperty(name)) continue; + var series = this.datasets[name]; + var x1 = series[0][0]; + if (!this.minxval || x1 < this.minxval) this.minxval = x1; + + var x2 = series[series.length - 1][0]; + if (!this.maxxval || x2 > this.maxxval) this.maxxval = x2; + } } this.xrange = this.maxxval - this.minxval; this.xscale = (this.xrange != 0 ? 1/this.xrange : 1.0); @@ -65,6 +70,7 @@ DygraphLayout.prototype._evaluateLineCharts = function() { for (var j = 0; j < dataset.length; j++) { var item = dataset[j]; var point = { + // TODO(danvk): here x: ((parseFloat(item[0]) - this.minxval) * this.xscale), y: 1.0 - ((parseFloat(item[1]) - this.minyval) * this.yscale), xval: parseFloat(item[0]), @@ -79,9 +85,7 @@ DygraphLayout.prototype._evaluateLineCharts = function() { if (point.y >= 1.0) { point.y = 1.0; } - if ((point.x >= 0.0) && (point.x <= 1.0)) { - this.points.push(point); - } + this.points.push(point); } } }; @@ -181,7 +185,9 @@ DygraphCanvasRenderer = function(dygraph, element, layout, options) { "axisLabelWidth": 50, "drawYGrid": true, "drawXGrid": true, - "gridLineColor": "rgb(128,128,128)" + "gridLineColor": "rgb(128,128,128)", + "fillAlpha": 0.15, + "underlayCallback": null }; Dygraph.update(this.options, options); @@ -271,6 +277,11 @@ DygraphCanvasRenderer.isSupported = function(canvasName) { DygraphCanvasRenderer.prototype.render = function() { // Draw the new X/Y grid var ctx = this.element.getContext("2d"); + + if (this.options.underlayCallback) { + this.options.underlayCallback(ctx, this.area, this.layout, this.dygraph_); + } + if (this.options.drawYGrid) { var ticks = this.layout.yticks; ctx.save(); @@ -440,7 +451,9 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { var context = this.element.getContext("2d"); var colorCount = this.options.colorScheme.length; var colorScheme = this.options.colorScheme; + var fillAlpha = this.options.fillAlpha; var errorBars = this.layout.options.errorBars; + var fillGraph = this.layout.options.fillGraph; var setNames = []; for (var name in this.layout.datasets) { @@ -450,7 +463,13 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { } var setCount = setNames.length; - //Update Points + this.colors = {} + for (var i = 0; i < setCount; i++) { + this.colors[setNames[i]] = colorScheme[i % colorCount]; + } + + // Update Points + // TODO(danvk): here for (var i = 0; i < this.layout.points.length; i++) { var point = this.layout.points[i]; point.canvasx = this.area.w * point.x + this.area.x; @@ -462,36 +481,92 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { var ctx = context; if (errorBars) { + if (fillGraph) { + this.dygraph_.warn("Can't use fillGraph option with error bars"); + } + for (var i = 0; i < setCount; i++) { var setName = setNames[i]; - var color = colorScheme[i % colorCount]; + var color = this.colors[setName]; // setup graphics context ctx.save(); ctx.strokeStyle = color; ctx.lineWidth = this.options.strokeWidth; - var prevX = -1; + var prevX = NaN; var prevYs = [-1, -1]; var count = 0; var yscale = this.layout.yscale; // should be same color as the lines but only 15% opaque. var rgb = new RGBColor(color); - var err_color = 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',0.15)'; + var err_color = 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + + fillAlpha + ')'; ctx.fillStyle = err_color; ctx.beginPath(); for (var j = 0; j < this.layout.points.length; j++) { var point = this.layout.points[j]; count++; if (point.name == setName) { - if (!point.y || isNaN(point.y)) { - prevX = -1; + if (!isOK(point.y)) { + prevX = NaN; continue; } + // TODO(danvk): here var newYs = [ point.y - point.errorPlus * yscale, point.y + point.errorMinus * yscale ]; newYs[0] = this.area.h * newYs[0] + this.area.y; newYs[1] = this.area.h * newYs[1] + this.area.y; - if (prevX >= 0) { + if (!isNaN(prevX)) { + ctx.moveTo(prevX, prevYs[0]); + ctx.lineTo(point.canvasx, newYs[0]); + ctx.lineTo(point.canvasx, newYs[1]); + ctx.lineTo(prevX, prevYs[1]); + ctx.closePath(); + } + prevYs[0] = newYs[0]; + prevYs[1] = newYs[1]; + prevX = point.canvasx; + } + } + ctx.fill(); + } + } else if (fillGraph) { + // TODO(danvk): merge this code with the logic above; they're very similar. + for (var i = 0; i < setCount; i++) { + var setName = setNames[i]; + var setNameLast; + if (i>0) setNameLast = setNames[i-1]; + var color = this.colors[setName]; + + // setup graphics context + ctx.save(); + ctx.strokeStyle = color; + ctx.lineWidth = this.options.strokeWidth; + var prevX = NaN; + var prevYs = [-1, -1]; + var count = 0; + var yscale = this.layout.yscale; + // should be same color as the lines but only 15% opaque. + var rgb = new RGBColor(color); + var err_color = 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + + fillAlpha + ')'; + ctx.fillStyle = err_color; + ctx.beginPath(); + for (var j = 0; j < this.layout.points.length; j++) { + var point = this.layout.points[j]; + count++; + if (point.name == setName) { + if (!isOK(point.y)) { + prevX = NaN; + continue; + } + var pX = 1.0 + this.layout.minyval * this.layout.yscale; + if (pX < 0.0) pX = 0.0; + else if (pX > 1.0) pX = 1.0; + var newYs = [ point.y, pX ]; + newYs[0] = this.area.h * newYs[0] + this.area.y; + newYs[1] = this.area.h * newYs[1] + this.area.y; + if (!isNaN(prevX)) { ctx.moveTo(prevX, prevYs[0]); ctx.lineTo(point.canvasx, newYs[0]); ctx.lineTo(point.canvasx, newYs[1]); @@ -509,7 +584,7 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { for (var i = 0; i < setCount; i++) { var setName = setNames[i]; - var color = colorScheme[i%colorCount]; + var color = this.colors[setName]; // setup graphics context context.save();