X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-canvas.js;h=d5c812e196398374fc196b2e1aa0323b9a860784;hb=5d13ef68a27544eff72ea3a2ef3aabdc4c4fd740;hp=2c183458a9147d33aa8a56e37e493e2637be85a3;hpb=f032c51dd2d8d17c30f8f55cf55d663b1f9df066;p=dygraphs.git diff --git a/dygraph-canvas.js b/dygraph-canvas.js index 2c18345..d5c812e 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) { @@ -491,11 +493,9 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { // 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); @@ -505,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 = 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); @@ -554,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; } } @@ -597,6 +616,15 @@ DygraphCanvasRenderer.prototype._renderLineChart = function() { var point = points[j]; if (point.name == setName) { if (!isOK(point.canvasy)) { + if (stepPlot && prevX != null) { + // Draw a horizontal line to the start of the missing data + ctx.beginPath(); + ctx.strokeStyle = color; + ctx.lineWidth = this.options.strokeWidth; + ctx.moveTo(prevX, prevY); + ctx.lineTo(point.canvasx, prevY); + ctx.stroke(); + } // this will make us move to the next point, not draw a line to it. prevX = prevY = null; } else { @@ -613,6 +641,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);