X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph.js;h=e19acada735a2b57a28eee05ebe4a37c7ffa717e;hb=7bba83d8116f0712e57ee4bf57e40ef3c749f3ff;hp=d738e54129c784dd03456e627a28decce533c883;hpb=9da9874082de50040c37a771ef45aead75443a20;p=dygraphs.git diff --git a/dygraph.js b/dygraph.js index d738e54..e19acad 100644 --- a/dygraph.js +++ b/dygraph.js @@ -80,9 +80,9 @@ Dygraph.DEFAULT_HEIGHT = 320; Dygraph.AXIS_LINE_WIDTH = 0.3; Dygraph.LOG_SCALE = 10; -Dygraph.LOG_BASE_E_OF_TEN = Math.log(Dygraph.LOG_SCALE); +Dygraph.LN_TEN = Math.log(Dygraph.LOG_SCALE); Dygraph.log10 = function(x) { - return Math.log(x) / Dygraph.LOG_BASE_E_OF_TEN; + return Math.log(x) / Dygraph.LN_TEN; } // Default attribute values. @@ -119,7 +119,6 @@ Dygraph.DEFAULT_ATTRS = { delimiter: ',', - logScale: false, sigma: 2.0, errorBars: false, fractions: false, @@ -362,7 +361,7 @@ Dygraph.prototype.yAxisRanges = function() { * axis. Uses the first axis by default. * Returns a two-element array: [X, Y] * - * Note: use toDomXCoord instead of toDomCoords(x. null) and use toDomYCoord + * Note: use toDomXCoord instead of toDomCoords(x, null) and use toDomYCoord * instead of toDomCoords(null, y, axis). */ Dygraph.prototype.toDomCoords = function(x, y, axis) { @@ -372,8 +371,8 @@ Dygraph.prototype.toDomCoords = function(x, y, axis) { /** * Convert from data x coordinates to canvas/div X coordinate. * If specified, do this conversion for the coordinate system of a particular - * axis. Uses the first axis by default. - * returns a single value or null if x is null. + * axis. + * Returns a single value or null if x is null. */ Dygraph.prototype.toDomXCoord = function(x) { if (x == null) { @@ -392,11 +391,12 @@ Dygraph.prototype.toDomXCoord = function(x) { * returns a single value or null if y is null. */ Dygraph.prototype.toDomYCoord = function(y, axis) { - var pct = toPercentYCoord(y, axis); + var pct = this.toPercentYCoord(y, axis); if (pct == null) { return null; } + var area = this.plotter_.area; return area.y + pct * area.h; } @@ -406,7 +406,7 @@ Dygraph.prototype.toDomYCoord = function(y, axis) { * axis. Uses the first axis by default. * Returns a two-element array: [X, Y]. * - * Note: use toDataXCoord instead of toDataCoords(x. null) and use toDataYCoord + * Note: use toDataXCoord instead of toDataCoords(x, null) and use toDataYCoord * instead of toDataCoords(null, y, axis). */ Dygraph.prototype.toDataCoords = function(x, y, axis) { @@ -442,7 +442,7 @@ Dygraph.prototype.toDataYCoord = function(y, axis) { var area = this.plotter_.area; var yRange = this.yAxisRange(axis); - if (!this.attr_("logscale")) { + if (!axis.logscale) { return yRange[0] + (area.h - y) / area.h * (yRange[1] - yRange[0]); } else { // Computing the inverse of toDomCoord. @@ -488,12 +488,13 @@ Dygraph.prototype.toPercentYCoord = function(y, axis) { if (y == null) { return null; } + if (typeof(axis) == "undefined") axis = 0; var area = this.plotter_.area; var yRange = this.yAxisRange(axis); var pct; - if (!this.attr_("logscale")) { + if (!this.axes_[axis].logscale) { // yrange[1] - y is unit distance from the bottom. // yrange[1] - yrange[0] is the scale of the range. // (yRange[1] - y) / (yRange[1] - yRange[0]) is the % from the bottom. @@ -964,7 +965,6 @@ Dygraph.movePan = function(event, g, context) { var axis = g.axes_[i]; var maxValue = axis.draggingValue + y_frac * axis.dragValueRange; var minValue = maxValue - axis.dragValueRange; - console.log(axis.draggingValue, axis.dragValueRange, minValue, maxValue, y_frac); axis.valueWindow = [ minValue, maxValue ]; } } @@ -1918,8 +1918,8 @@ Dygraph.dateTicker = function(startDate, endDate, self) { * Add ticks when the x axis has numbers on it (instead of dates) * TODO(konigsberg): Update comment. * - * @param {Number} startDate Start of the date window (millis since epoch) - * @param {Number} endDate End of the date window (millis since epoch) + * @param {Number} minV minimum value + * @param {Number} maxV maximum value * @param self * @param {function} attribute accessor function. * @return {Array.} Array of {label, value} tuples. @@ -1937,7 +1937,7 @@ Dygraph.numericTicks = function(minV, maxV, self, axis_props, vals) { ticks.push({v: vals[i]}); } } else { - if (self.attr_("logscale")) { + if (axis_props && attr("logscale")) { // As opposed to the other ways for computing ticks, we're just going // for nearby values. There's no reasonable way to scale the values // (unless we want to show strings like "log(" + x + ")") in which case @@ -1945,13 +1945,17 @@ Dygraph.numericTicks = function(minV, maxV, self, axis_props, vals) { // so compute height / pixelsPerTick and move on. var pixelsPerTick = attr('pixelsPerYLabel'); + // NOTE(konigsberg): Dan, should self.height_ be self.plotter_.area.h? var nTicks = Math.floor(self.height_ / pixelsPerTick); var vv = minV; - + var lmv = Dygraph.log10(minV); + var lxv = Dygraph.log10(maxV); + var logMultiplier = (lxv - lmv) / nTicks; + var multiplier = Math.pow(Dygraph.LOG_SCALE, logMultiplier); // Construct the set of ticks. for (var i = 0; i < nTicks; i++) { ticks.push( {v: vv} ); - vv = vv * Dygraph.LOG_SCALE; + vv = vv * multiplier; } } else { // Basic idea: @@ -2081,7 +2085,7 @@ Dygraph.prototype.extremeValues_ = function(series) { * number of axes, rolling averages, etc. */ Dygraph.prototype.predraw_ = function() { - // TODO(danvk): move more computations out of drawGraph_ and into here. + // TODO(danvk): movabilitye more computations out of drawGraph_ and into here. this.computeYAxes_(); // Create a new plotter. @@ -2135,12 +2139,24 @@ Dygraph.prototype.drawGraph_ = function() { var seriesName = this.attr_("labels")[i]; var connectSeparatedPoints = this.attr_('connectSeparatedPoints', i); + var logScale = this.attr_('logscale', i); var series = []; for (var j = 0; j < data.length; j++) { - if (data[j][i] != null || !connectSeparatedPoints) { - var date = data[j][0]; - series.push([date, data[j][i]]); + var date = data[j][0]; + var point = data[j][i]; + if (logScale) { + // On the log scale, points less than zero do not exist. + // This will create a gap in the chart. Note that this ignores + // connectSeparatedPoints. + if (point < 0) { + point = null; + } + series.push([date, point]); + } else { + if (point != null || !connectSeparatedPoints) { + series.push([date, point]); + } } } @@ -2271,7 +2287,8 @@ Dygraph.prototype.computeYAxes_ = function() { 'pixelsPerYLabel', 'yAxisLabelWidth', 'axisLabelFontSize', - 'axisTickSize' + 'axisTickSize', + 'logscale' ]; // Copy global axis options over to the first axis. @@ -2359,7 +2376,6 @@ Dygraph.prototype.computeYAxisRanges_ = function(extremes) { // Compute extreme values, a span and tick marks for each axis. for (var i = 0; i < this.axes_.length; i++) { - var isLogScale = this.attr_("logscale"); var axis = this.axes_[i]; if (axis.valueWindow) { // This is only set if the user has zoomed on the y-axis. It is never set @@ -2387,7 +2403,7 @@ Dygraph.prototype.computeYAxisRanges_ = function(extremes) { var maxAxisY; var minAxisY; - if (isLogScale) { + if (axis.logscale) { var maxAxisY = maxY + 0.1 * span; var minAxisY = minY; } else {