X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph.js;h=7fc778f0766c33421eb1530d00be86fae5473cae;hb=43af96e75cba5447301daf3fa4347729d115fdc8;hp=1df7cc1b8761d719bb72d90ad6d3a4d4b14beffc;hpb=a9476896742bea976a06f295df619c7e9ca320dd;p=dygraphs.git diff --git a/dygraph.js b/dygraph.js index 1df7cc1..7fc778f 100644 --- a/dygraph.js +++ b/dygraph.js @@ -114,7 +114,11 @@ Dygraph.DEFAULT_ATTRS = { fractions: false, wilsonInterval: true, // only relevant if fractions is true customBars: false, - fillGraph: false + fillGraph: false, + fillAlpha: 0.15, + + stackedGraph: false, + hideOverlayOnMouseOut: true }; // Various logging levels. @@ -183,6 +187,11 @@ Dygraph.prototype.__init__ = function(div, file, attrs) { this.height_ = (this.height_ * self.innerHeight / 100) - 10; } + if (attrs['stackedGraph']) { + attrs['fillGraph'] = true; + // TODO(nikhilk): Add any other stackedGraph checks here. + } + // Dygraphs has many options, some of which interact with one another. // To keep track of everything, we maintain two sets of options: // @@ -398,8 +407,10 @@ Dygraph.prototype.setColors_ = function() { var val = this.attr_('colorValue') || 0.5; for (var i = 1; i <= num; i++) { if (!this.visibility()[i-1]) continue; - var hue = (1.0*i/(1+num)); - this.colors_.push( Dygraph.hsvToRGB(hue, sat, val) ); + // alternate colors for high contrast. + var idx = i - parseInt(i % 2 ? i / 2 : (i - num)/2, 10); + var hue = (1.0 * idx/ (1 + num)); + this.colors_.push(Dygraph.hsvToRGB(hue, sat, val)); } } else { for (var i = 0; i < num; i++) { @@ -416,6 +427,15 @@ Dygraph.prototype.setColors_ = function() { Dygraph.update(this.layoutOptions_, this.attrs_); } +/** + * Return the list of colors. This is either the list of colors passed in the + * attributes, or the autogenerated list of rgb(r,g,b) strings. + * @return {Array} The list of colors. + */ +Dygraph.prototype.getColors = function() { + return this.colors_; +}; + // The following functions are from quirksmode.org // http://www.quirksmode.org/js/findpos.html Dygraph.findPosX = function(obj) { @@ -767,7 +787,18 @@ Dygraph.prototype.mouseMove_ = function(event) { } if (this.attr_("highlightCallback")) { - this.attr_("highlightCallback")(event, lastx, this.selPoints_); + var callbackPoints = this.selPoints_.map( + function(p) { return {xval: p.xval, yval: p.yval, name: p.name} }); + if (this.attr_("stackedGraph")) { + // "unstack" the points. + var cumulative_sum = 0; + for (var j = callbackPoints.length - 1; j >= 0; j--) { + callbackPoints[j].yval -= cumulative_sum; + cumulative_sum += callbackPoints[j].yval; + } + } + + this.attr_("highlightCallback")(event, lastx, callbackPoints); } // Clear the previously drawn vertical, if there is one @@ -803,7 +834,7 @@ Dygraph.prototype.mouseMove_ = function(event) { this.lastx_ = lastx; // Draw colored circles over the center of each selected point - ctx.save() + ctx.save(); for (var i = 0; i < this.selPoints_.length; i++) { if (!isOK(this.selPoints_[i%clen].canvasy)) continue; ctx.beginPath(); @@ -824,10 +855,12 @@ Dygraph.prototype.mouseMove_ = function(event) { * @private */ Dygraph.prototype.mouseOut_ = function(event) { - // Get rid of the overlay data - var ctx = this.canvas_.getContext("2d"); - ctx.clearRect(0, 0, this.width_, this.height_); - this.attr_("labelsDiv").innerHTML = ""; + if (this.attr_("hideOverlayOnMouseOut")) { + // Get rid of the overlay data + var ctx = this.canvas_.getContext("2d"); + ctx.clearRect(0, 0, this.width_, this.height_); + this.attr_("labelsDiv").innerHTML = ""; + } }; Dygraph.zeropad = function(x) { @@ -1243,7 +1276,12 @@ Dygraph.prototype.drawGraph_ = function(data) { this.setColors_(); this.attrs_['pointSize'] = 0.5 * this.attr_('highlightCircleSize'); + // For stacked series. + var cumulative_y = []; + var datasets = []; + // Loop over all fields in the dataset + for (var i = 1; i < data[0].length; i++) { if (!this.visibility()[i - 1]) continue; @@ -1280,11 +1318,35 @@ Dygraph.prototype.drawGraph_ = function(data) { vals[j] = [series[j][0], series[j][1][0], series[j][1][1], series[j][1][2]]; this.layout_.addDataset(this.attr_("labels")[i], vals); + } else if (this.attr_("stackedGraph")) { + var vals = []; + var l = series.length; + var actual_y; + for (var j = 0; j < l; j++) { + if (cumulative_y[series[j][0]] === undefined) + cumulative_y[series[j][0]] = 0; + + actual_y = series[j][1]; + cumulative_y[series[j][0]] += actual_y; + + vals[j] = [series[j][0], cumulative_y[series[j][0]]] + + if (!maxY || cumulative_y[series[j][0]] > maxY) + maxY = cumulative_y[series[j][0]]; + } + datasets.push([this.attr_("labels")[i], vals]); + //this.layout_.addDataset(this.attr_("labels")[i], vals); } else { this.layout_.addDataset(this.attr_("labels")[i], series); } } + if (datasets.length > 0) { + for (var i = (datasets.length - 1); i >= 0; i--) { + this.layout_.addDataset(datasets[i][0], datasets[i][1]); + } + } + // Use some heuristics to come up with a good maxY value, unless it's been // set explicitly by the user. if (this.valueRange_ != null) {