X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-canvas.js;h=2eb5ce1bb296bb702ee20ecda268cff330416837;hb=fb369f35fe90a793a8f41e9cff251eae23e782d8;hp=979688d907ab50e7317c881ea27a794bdf85e33d;hpb=56623f3b4aa7ba86b08c3710be9b219de9e99f9d;p=dygraphs.git diff --git a/dygraph-canvas.js b/dygraph-canvas.js index 979688d..2eb5ce1 100644 --- a/dygraph-canvas.js +++ b/dygraph-canvas.js @@ -279,7 +279,7 @@ DygraphCanvasRenderer.prototype.render = function() { var ctx = this.element.getContext("2d"); if (this.options.underlayCallback) { - this.options.underlayCallback(ctx, this.area, this.layout); + this.options.underlayCallback(ctx, this.area, this.layout, this.dygraph_); } if (this.options.drawYGrid) { @@ -454,6 +454,8 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { var fillAlpha = this.options.fillAlpha; var errorBars = this.layout.options.errorBars; var fillGraph = this.layout.options.fillGraph; + var stackedGraph = this.layout.options.stackedGraph; + var stepPlot = this.layout.options.stepPlot; var setNames = []; for (var name in this.layout.datasets) { @@ -463,6 +465,11 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { } var setCount = setNames.length; + 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++) { @@ -482,15 +489,13 @@ 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 ctx.save(); - ctx.strokeStyle = color; - ctx.lineWidth = this.options.strokeWidth; var prevX = NaN; + var prevY = 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); @@ -500,46 +505,60 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { 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; } // TODO(danvk): here - var newYs = [ point.y - point.errorPlus * yscale, - point.y + point.errorMinus * yscale ]; + if (stepPlot) { + var newYs = [ prevY - point.errorPlus * yscale, + prevY + point.errorMinus * yscale ]; + prevY = point.y; + } else { + 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 (!isNaN(prevX)) { - ctx.moveTo(prevX, prevYs[0]); + if (stepPlot) { + ctx.moveTo(prevX, newYs[0]); + } else { + ctx.moveTo(prevX, prevYs[0]); + } ctx.lineTo(point.canvasx, newYs[0]); ctx.lineTo(point.canvasx, newYs[1]); - ctx.lineTo(prevX, prevYs[1]); + if (stepPlot) { + ctx.lineTo(prevX, newYs[1]); + } else { + ctx.lineTo(prevX, prevYs[1]); + } ctx.closePath(); } - prevYs[0] = newYs[0]; - prevYs[1] = newYs[1]; + prevYs = newYs; 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 axisY = 1.0 + this.layout.minyval * this.layout.yscale; + if (axisY < 0.0) axisY = 0.0; + else if (axisY > 1.0) axisY = 1.0; + axisY = this.area.h * axisY + this.area.y; + + var baseline = [] // for stacked graphs: baseline for filling + + // process sets in reverse order (needed for stacked graphs) + for (var i = setCount - 1; i >= 0; i--) { var setName = setNames[i]; - var setNameLast; - if (i>0) setNameLast = setNames[i-1]; - 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 = 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); @@ -549,27 +568,32 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { 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; + var newYs; + if (stackedGraph) { + lastY = baseline[point.canvasx]; + if (lastY === undefined) lastY = axisY; + baseline[point.canvasx] = point.canvasy; + newYs = [ point.canvasy, lastY ]; + } else { + newYs = [ point.canvasy, axisY ]; + } if (!isNaN(prevX)) { ctx.moveTo(prevX, prevYs[0]); - ctx.lineTo(point.canvasx, newYs[0]); + if (stepPlot) { + ctx.lineTo(point.canvasx, prevYs[0]); + } else { + 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]; + prevYs = newYs; prevX = point.canvasx; } } @@ -579,7 +603,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(); @@ -608,6 +632,9 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { ctx.strokeStyle = color; ctx.lineWidth = this.options.strokeWidth; ctx.moveTo(prevX, prevY); + if (stepPlot) { + ctx.lineTo(point.canvasx, prevY); + } prevX = point.canvasx; prevY = point.canvasy; ctx.lineTo(prevX, prevY);