X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-canvas.js;h=fc7ab1d80bdd4be6b09b4b5a1a9fb6ba5739a47f;hb=e4416fb9d0c2894387c2c2eedaa953d10998700f;hp=c6c5b1e87b5bc6adee6fbc84f5e041d434dfd330;hpb=b304aaecb6728af27bc6f7e2b553570556e85e45;p=dygraphs.git diff --git a/dygraph-canvas.js b/dygraph-canvas.js index c6c5b1e..fc7ab1d 100644 --- a/dygraph-canvas.js +++ b/dygraph-canvas.js @@ -88,6 +88,9 @@ DygraphLayout.prototype._evaluateLimits = function() { axis.maxyval = axis.computedValueRange[1]; axis.yrange = axis.maxyval - axis.minyval; axis.yscale = (axis.yrange != 0 ? 1.0 / axis.yrange : 1.0); + + axis.ylogrange = Math.log(axis.maxyval) - Math.log(axis.minyval); + axis.ylogscale = (axis.ylogrange != 0 ? 1.0 / axis.ylogrange : 1.0); } }; @@ -102,10 +105,17 @@ DygraphLayout.prototype._evaluateLineCharts = function() { for (var j = 0; j < dataset.length; j++) { var item = dataset[j]; + + var yval; + if (this.dygraph_.attr_("logscale")) { + yval = 1.0 - ((Math.log(parseFloat(item[1])) - Math.log(axis.minyval)) * axis.ylogscale); // really should just be yscale. + } else { + yval = 1.0 - ((parseFloat(item[1]) - axis.minyval) * axis.yscale); + } var point = { // TODO(danvk): here x: ((parseFloat(item[0]) - this.minxval) * this.xscale), - y: 1.0 - ((parseFloat(item[1]) - axis.minyval) * axis.yscale), + y: yval, xval: parseFloat(item[0]), yval: parseFloat(item[1]), name: setName @@ -133,7 +143,7 @@ DygraphLayout.prototype._evaluateLineTicks = function() { for (var j = 0; j < axis.ticks.length; j++) { var tick = axis.ticks[j]; var label = tick.label; - var pos = 1.0 - (axis.yscale * (tick.v - axis.minyval)); + var pos = this.dygraph_.toPercentYCoord(tick.v, i); if ((pos >= 0.0) && (pos <= 1.0)) { this.yticks.push([i, pos, label]); } @@ -386,11 +396,16 @@ DygraphCanvasRenderer.isSupported = function(canvasName) { * Draw an X/Y grid on top of the existing plot */ DygraphCanvasRenderer.prototype.render = function() { - // Draw the new X/Y grid + // Draw the new X/Y grid. Lines appear crisper when pixels are rounded to + // half-integers. This prevents them from drawing in two rows/cols. var ctx = this.element.getContext("2d"); + function halfUp(x){return Math.round(x)+0.5}; + function halfDown(y){return Math.round(y)-0.5}; if (this.options.underlayCallback) { - this.options.underlayCallback(ctx, this.area, this.layout, this.dygraph_); + // NOTE: we pass the dygraph object to this callback twice to avoid breaking + // users who expect a deprecated form of this callback. + this.options.underlayCallback(ctx, this.area, this.dygraph_, this.dygraph_); } if (this.options.drawYGrid) { @@ -401,8 +416,8 @@ DygraphCanvasRenderer.prototype.render = function() { for (var i = 0; i < ticks.length; i++) { // TODO(danvk): allow secondary axes to draw a grid, too. if (ticks[i][0] != 0) continue; - var x = this.area.x; - var y = this.area.y + ticks[i][1] * this.area.h; + var x = halfUp(this.area.x); + var y = halfDown(this.area.y + ticks[i][1] * this.area.h); ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x + this.area.w, y); @@ -417,8 +432,8 @@ DygraphCanvasRenderer.prototype.render = function() { ctx.strokeStyle = this.options.gridLineColor; ctx.lineWidth = this.options.axisLineWidth; for (var i=0; i