Blame | Letzte Änderung | Log anzeigen | RSS feed
/*** jqPlot* Pure JavaScript plotting plugin using jQuery** Version: 1.0.8* Revision: 1250** Copyright (c) 2009-2013 Chris Leonello* jqPlot is currently available for use in all personal or commercial projects* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can* choose the license that best suits your project and use it accordingly.** Although not required, the author would appreciate an email letting him* know of any substantial use of jqPlot. You can reach the author at:* chris at jqplot dot com or see http://www.jqplot.com/info.php .** If you are feeling kind and generous, consider supporting the project by* making a donation at: http://www.jqplot.com/donate.php .** sprintf functions contained in jqplot.sprintf.js by Ash Searle:** version 2007.04.27* author Ash Searle* http://hexmen.com/blog/2007/03/printf-sprintf/* http://hexmen.com/js/sprintf.js* The author (Ash Searle) has placed this code in the public domain:* "This code is unrestricted: you are free to use it however you like."**/(function($) {// Class: $.jqplot.BezierCurveRenderer.js// Renderer which draws lines as stacked bezier curves.// Data for the line will not be specified as an array of// [x, y] data point values, but as a an array of [start piont, bezier curve]// So, the line is specified as: [[xstart, ystart], [cp1x, cp1y, cp2x, cp2y, xend, yend]].$.jqplot.BezierCurveRenderer = function(){$.jqplot.LineRenderer.call(this);};$.jqplot.BezierCurveRenderer.prototype = new $.jqplot.LineRenderer();$.jqplot.BezierCurveRenderer.prototype.constructor = $.jqplot.BezierCurveRenderer;// Method: setGridData// converts the user data values to grid coordinates and stores them// in the gridData array.// Called with scope of a series.$.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot) {// recalculate the grid datavar xp = this._xaxis.series_u2p;var yp = this._yaxis.series_u2p;// this._plotData should be same as this.datavar data = this.data;this.gridData = [];this._prevGridData = [];// if seriesIndex = 0, fill to x axis.// if seriesIndex > 0, fill to previous series data.var idx = this.index;if (data.length == 2) {if (idx == 0) {this.gridData = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],[xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)],[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]];}else {var psd = plot.series[idx-1].data;this.gridData = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],[xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])],[xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]),xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]];}}else {if (idx == 0) {this.gridData = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],[xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)],[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]];}else {var psd = plot.series[idx-1].data;this.gridData = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],[xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])],[xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]),xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]];}}};// Method: makeGridData// converts any arbitrary data values to grid coordinates and// returns them. This method exists so that plugins can use a series'// linerenderer to generate grid data points without overwriting the// grid data associated with that series.// Called with scope of a series.$.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data, plot) {// recalculate the grid datavar xp = this._xaxis.series_u2p;var yp = this._yaxis.series_u2p;var gd = [];var pgd = [];// if seriesIndex = 0, fill to x axis.// if seriesIndex > 0, fill to previous series data.var idx = this.index;if (data.length == 2) {if (idx == 0) {gd = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],[xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)],[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]];}else {var psd = plot.series[idx-1].data;gd = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],[xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])],[xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]),xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]];}}else {if (idx == 0) {gd = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],[xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)],[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]];}else {var psd = plot.series[idx-1].data;gd = [[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],[xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])],[xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]),xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]];}}return gd;};// called within scope of series.$.jqplot.BezierCurveRenderer.prototype.draw = function(ctx, gd, options) {var i;ctx.save();if (gd.length) {if (this.showLine) {ctx.save();var opts = (options != null) ? options : {};ctx.fillStyle = opts.fillStyle || this.color;ctx.beginPath();ctx.moveTo(gd[0][0], gd[0][1]);ctx.bezierCurveTo(gd[1][0], gd[1][1], gd[1][2], gd[1][3], gd[1][4], gd[1][5]);ctx.lineTo(gd[2][0], gd[2][1]);if (gd[3].length == 2) {ctx.lineTo(gd[3][0], gd[3][1]);}else {ctx.bezierCurveTo(gd[3][0], gd[3][1], gd[3][2], gd[3][3], gd[3][4], gd[3][5]);}ctx.closePath();ctx.fill();ctx.restore();}}ctx.restore();};$.jqplot.BezierCurveRenderer.prototype.drawShadow = function(ctx, gd, options) {// This is a no-op, shadows drawn with lines.};$.jqplot.BezierAxisRenderer = function() {$.jqplot.LinearAxisRenderer.call(this);};$.jqplot.BezierAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();$.jqplot.BezierAxisRenderer.prototype.constructor = $.jqplot.BezierAxisRenderer;// Axes on a plot with Bezier Curves$.jqplot.BezierAxisRenderer.prototype.init = function(options){$.extend(true, this, options);var db = this._dataBounds;// Go through all the series attached to this axis and find// the min/max bounds for this axis.for (var i=0; i<this._series.length; i++) {var s = this._series[i];var d = s.data;if (d.length == 4) {for (var j=0; j<d.length; j++) {if (this.name == 'xaxis' || this.name == 'x2axis') {if (d[j][0] < db.min || db.min == null) {db.min = d[j][0];}if (d[j][0] > db.max || db.max == null) {db.max = d[j][0];}}else {if (d[j][1] < db.min || db.min == null) {db.min = d[j][1];}if (d[j][1] > db.max || db.max == null) {db.max = d[j][1];}}}}else {if (this.name == 'xaxis' || this.name == 'x2axis') {if (d[0][0] < db.min || db.min == null) {db.min = d[0][0];}if (d[0][0] > db.max || db.max == null) {db.max = d[0][0];}for (var j=0; j<5; j+=2) {if (d[1][j] < db.min || db.min == null) {db.min = d[1][j];}if (d[1][j] > db.max || db.max == null) {db.max = d[1][j];}}}else {if (d[0][1] < db.min || db.min == null) {db.min = d[0][1];}if (d[0][1] > db.max || db.max == null) {db.max = d[0][1];}for (var j=1; j<6; j+=2) {if (d[1][j] < db.min || db.min == null) {db.min = d[1][j];}if (d[1][j] > db.max || db.max == null) {db.max = d[1][j];}}}}}};// setup default renderers for axes and legend so user doesn't have to// called with scope of plotfunction preInit(target, data, options) {options = options || {};options.axesDefaults = $.extend(true, {pad:0}, options.axesDefaults);options.seriesDefaults = options.seriesDefaults || {};options.legend = $.extend(true, {placement:'outside'}, options.legend);// only set these if there is a pie seriesvar setopts = false;if (options.seriesDefaults.renderer == $.jqplot.BezierCurveRenderer) {setopts = true;}else if (options.series) {for (var i=0; i < options.series.length; i++) {if (options.series[i].renderer == $.jqplot.BezierCurveRenderer) {setopts = true;}}}if (setopts) {options.axesDefaults.renderer = $.jqplot.BezierAxisRenderer;}}$.jqplot.preInitHooks.push(preInit);})(jQuery);