X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph.js;h=6728bc47143bf8588e8e9c64cc6989c3eb2fd1a9;hb=ad617f174a6b4ec2aea3d06553534dcaf278a2bb;hp=cc983a6b228f92e44c79e1eb5aa54f4dbbaccd62;hpb=7ad6c698d28d7d0f0770e1f6490f1a9649c64b6f;p=dygraphs.git diff --git a/dygraph.js b/dygraph.js index cc983a6..6728bc4 100644 --- a/dygraph.js +++ b/dygraph.js @@ -2284,6 +2284,17 @@ Dygraph.prototype.gatherDatasets_ = function(rolledSeries, dateWindow) { var datasets = []; var extremes = {}; // series name -> [low, high] var i, j, k; + var errorBars = this.attr_("errorBars"); + var customBars = this.attr_("customBars"); + var bars = errorBars || customBars; + var isValueNull = function(sample) { + if (!bars) { + return sample[1] === null; + } else { + return customBars ? sample[1][1] === null : + errorBars ? sample[1][0] === null : false; + } + }; // Loop over the fields (series). Go from the last to the first, // because if they're stacked that's how we accumulate the values. @@ -2302,11 +2313,11 @@ Dygraph.prototype.gatherDatasets_ = function(rolledSeries, dateWindow) { // Prune down to the desired range, if necessary (for zooming) // Because there can be lines going to points outside of the visible area, // we actually prune to visible points, plus one on either side. - var bars = this.attr_("errorBars") || this.attr_("customBars"); if (dateWindow) { var low = dateWindow[0]; var high = dateWindow[1]; var pruned = []; + // TODO(danvk): do binary search instead of linear search. // TODO(danvk): pass firstIdx and lastIdx directly to the renderer. var firstIdx = null, lastIdx = null; @@ -2318,14 +2329,36 @@ Dygraph.prototype.gatherDatasets_ = function(rolledSeries, dateWindow) { lastIdx = k; } } + if (firstIdx === null) firstIdx = 0; - if (firstIdx > 0) firstIdx--; + var correctedFirstIdx = firstIdx; + var isInvalidValue = true; + while (isInvalidValue && correctedFirstIdx > 0) { + correctedFirstIdx--; + isInvalidValue = isValueNull(series[correctedFirstIdx]); + } + if (lastIdx === null) lastIdx = series.length - 1; - if (lastIdx < series.length - 1) lastIdx++; - boundaryIds[i-1] = [firstIdx, lastIdx]; + var correctedLastIdx = lastIdx; + isInvalidValue = true; + while (isInvalidValue && correctedLastIdx < series.length - 1) { + correctedLastIdx++; + isInvalidValue = isValueNull(series[correctedLastIdx]); + } + + boundaryIds[i-1] = [(firstIdx > 0) ? firstIdx - 1 : firstIdx, + (lastIdx < series.length - 1) ? lastIdx + 1 : lastIdx]; + + if (correctedFirstIdx!==firstIdx) { + pruned.push(series[correctedFirstIdx]); + } for (k = firstIdx; k <= lastIdx; k++) { pruned.push(series[k]); } + if (correctedLastIdx !== lastIdx) { + pruned.push(series[correctedLastIdx]); + } + series = pruned; } else { boundaryIds[i-1] = [0, series.length-1]; @@ -2447,7 +2480,6 @@ Dygraph.prototype.drawGraph_ = function() { // Save the X axis zoomed status as the updateOptions call will tend to set it erroneously var tmp_zoomed_x = this.zoomed_x_; // Tell PlotKit to use this new data and render itself - this.layout_.setDateWindow(this.dateWindow_); this.zoomed_x_ = tmp_zoomed_x; this.layout_.evaluateWithError(); this.renderGraph_(is_initial_draw); @@ -2732,12 +2764,12 @@ Dygraph.prototype.computeYAxisRanges_ = function(extremes) { opts, this); // Define the first independent axis as primary axis. - if(!p_axis) - p_axis = axis; + if (!p_axis) p_axis = axis; } } - if(p_axis === undefined) + if (p_axis === undefined) { throw ("Configuration Error: At least one axis has to have the \"independentTicks\" option activated."); + } // Add ticks. By default, all axes inherit the tick positions of the // primary axis. However, if an axis is specifically marked as having // independent ticks, then that is permissible as well.