Commit 42187739fffa33cd2f0527ead51cb553b8ff258d
1 parent
fc6c91b0
updated d3-scatterplot
Showing
10 changed files
with
145 additions
and
74 deletions
bower.json
| @@ -20,6 +20,7 @@ | @@ -20,6 +20,7 @@ | ||
| 20 | "iron-icon": "PolymerElements/iron-icon#~1.0.7", | 20 | "iron-icon": "PolymerElements/iron-icon#~1.0.7", |
| 21 | "iron-icons": "PolymerElements/iron-icons#~1.1.2", | 21 | "iron-icons": "PolymerElements/iron-icons#~1.1.2", |
| 22 | "paper-toast": "PolymerElements/paper-toast#~1.2.1", | 22 | "paper-toast": "PolymerElements/paper-toast#~1.2.1", |
| 23 | - "d3-scatterplot-matrix": "^0.1.0" | 23 | + "d3-scatterplot-matrix": "^0.1.0", |
| 24 | + "d3-scatterplot": "^1.1.0" | ||
| 24 | } | 25 | } |
| 25 | } | 26 | } |
bower_components/d3-scatterplot/.bower.json
| @@ -21,14 +21,14 @@ | @@ -21,14 +21,14 @@ | ||
| 21 | "dependencies": { | 21 | "dependencies": { |
| 22 | "d3": "^3.5.17" | 22 | "d3": "^3.5.17" |
| 23 | }, | 23 | }, |
| 24 | - "version": "1.1.0", | ||
| 25 | - "_release": "1.1.0", | 24 | + "version": "1.2.0", |
| 25 | + "_release": "1.2.0", | ||
| 26 | "_resolution": { | 26 | "_resolution": { |
| 27 | "type": "version", | 27 | "type": "version", |
| 28 | - "tag": "1.1.0", | ||
| 29 | - "commit": "9b30b60eb35b60c7c8c83cd86107a27cae0b9db9" | 28 | + "tag": "1.2.0", |
| 29 | + "commit": "0aaed8cda9972abba45aa474e2167663bee29098" | ||
| 30 | }, | 30 | }, |
| 31 | "_source": "https://github.com/mwasiluk/d3-scatterplot.git", | 31 | "_source": "https://github.com/mwasiluk/d3-scatterplot.git", |
| 32 | - "_target": "^1.0.0", | 32 | + "_target": "^1.1.0", |
| 33 | "_originalSource": "d3-scatterplot" | 33 | "_originalSource": "d3-scatterplot" |
| 34 | } | 34 | } |
| 35 | \ No newline at end of file | 35 | \ No newline at end of file |
bower_components/d3-scatterplot/README.md
| 1 | # d3-scatterplot | 1 | # d3-scatterplot |
| 2 | 2 | ||
| 3 | +You can install this package through `Bower` : | ||
| 4 | + | ||
| 5 | + bower install d3-scatterplot --save | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +<br/><br/> | ||
| 3 | <img src="http://routetopa.eu/wp-content/uploads/2015/06/eu-flag.jpg" width="22"> | 9 | <img src="http://routetopa.eu/wp-content/uploads/2015/06/eu-flag.jpg" width="22"> |
| 4 | This project has received funding from the European Union’s Horizon 2020 research and innovation programme under grant agreement No 645860. | 10 | This project has received funding from the European Union’s Horizon 2020 research and innovation programme under grant agreement No 645860. |
| 5 | 11 |
bower_components/d3-scatterplot/demo/demo.js
| @@ -3,6 +3,9 @@ var conf = { | @@ -3,6 +3,9 @@ var conf = { | ||
| 3 | // height: 500, | 3 | // height: 500, |
| 4 | dot:{ | 4 | dot:{ |
| 5 | // color: 'red' | 5 | // color: 'red' |
| 6 | + }, | ||
| 7 | + x:{ | ||
| 8 | + // scale: "log" | ||
| 6 | } | 9 | } |
| 7 | }; | 10 | }; |
| 8 | var data = [ | 11 | var data = [ |
| @@ -17,4 +20,4 @@ var data = [ | @@ -17,4 +20,4 @@ var data = [ | ||
| 17 | 20 | ||
| 18 | ]; | 21 | ]; |
| 19 | var plot = new D3ScatterPlot("#scatterplot", data, conf); | 22 | var plot = new D3ScatterPlot("#scatterplot", data, conf); |
| 20 | -plot.init(); | ||
| 21 | \ No newline at end of file | 23 | \ No newline at end of file |
| 24 | + |
bower_components/d3-scatterplot/demo/index.html
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | <body> | 8 | <body> |
| 9 | <h1>D3 scatterplot demo</h1> | 9 | <h1>D3 scatterplot demo</h1> |
| 10 | 10 | ||
| 11 | -<div id="scatterplot" style="width:auto; min-height:500px;"></div> | 11 | +<div id="scatterplot" style=" width: 100%; height: 600px;"></div> |
| 12 | 12 | ||
| 13 | <script src="../bower_components/d3/d3.min.js" charset="utf-8"></script> | 13 | <script src="../bower_components/d3/d3.min.js" charset="utf-8"></script> |
| 14 | <script src="../dist/d3-scatterplot.js" charset="utf-8"></script> | 14 | <script src="../dist/d3-scatterplot.js" charset="utf-8"></script> |
bower_components/d3-scatterplot/dist/d3-scatterplot.js
| 1 | function D3ScatterPlotUtils(){} | 1 | function D3ScatterPlotUtils(){} |
| 2 | 2 | ||
| 3 | // usage example deepExtend({}, objA, objB); => should work similar to $.extend(true, {}, objA, objB); | 3 | // usage example deepExtend({}, objA, objB); => should work similar to $.extend(true, {}, objA, objB); |
| 4 | -D3ScatterPlotUtils.prototype.deepExtend = function(out) { //TODO consider using jquery / lo-dash / underscore / ECMA6 ; fallbacks? | 4 | +D3ScatterPlotUtils.prototype.deepExtend = function (out) { |
| 5 | 5 | ||
| 6 | - var utils =this; | 6 | + var utils = this; |
| 7 | + var emptyOut = {}; | ||
| 8 | + | ||
| 9 | + | ||
| 10 | + if (!out && arguments.length > 1 && Array.isArray(arguments[1])) { | ||
| 11 | + out = []; | ||
| 12 | + } | ||
| 7 | out = out || {}; | 13 | out = out || {}; |
| 8 | 14 | ||
| 9 | for (var i = 1; i < arguments.length; i++) { | 15 | for (var i = 1; i < arguments.length; i++) { |
| 10 | - var obj = arguments[i]; | ||
| 11 | - | ||
| 12 | - if (!obj) | 16 | + var source = arguments[i]; |
| 17 | + if (!source) | ||
| 13 | continue; | 18 | continue; |
| 14 | 19 | ||
| 15 | - for (var key in obj) { | ||
| 16 | - if (obj.hasOwnProperty(key)) { | ||
| 17 | - if (typeof obj[key] === 'object') | ||
| 18 | - out[key] = utils.deepExtend(out[key], obj[key]); | ||
| 19 | - else | ||
| 20 | - out[key] = obj[key]; | 20 | + for (var key in source) { |
| 21 | + if (!source.hasOwnProperty(key)) { | ||
| 22 | + continue; | ||
| 23 | + } | ||
| 24 | + var isArray = Array.isArray(out[key]); | ||
| 25 | + var isObject = utils.isObject(out[key]); | ||
| 26 | + var srcObj = utils.isObject(source[key]); | ||
| 27 | + | ||
| 28 | + if (isObject && !isArray && srcObj) { | ||
| 29 | + utils.deepExtend(out[key], source[key]); | ||
| 30 | + } else { | ||
| 31 | + out[key] = source[key]; | ||
| 21 | } | 32 | } |
| 22 | } | 33 | } |
| 23 | } | 34 | } |
| @@ -25,7 +36,15 @@ D3ScatterPlotUtils.prototype.deepExtend = function(out) { //TODO consider using | @@ -25,7 +36,15 @@ D3ScatterPlotUtils.prototype.deepExtend = function(out) { //TODO consider using | ||
| 25 | return out; | 36 | return out; |
| 26 | }; | 37 | }; |
| 27 | 38 | ||
| 28 | - | 39 | +D3ScatterPlotUtils.prototype.isObject = function(a) { |
| 40 | + return a !== null && typeof a === 'object'; | ||
| 41 | +}; | ||
| 42 | +D3ScatterPlotUtils.prototype.isNumber = function(a) { | ||
| 43 | + return !isNaN(a) && typeof a === 'number'; | ||
| 44 | +}; | ||
| 45 | +D3ScatterPlotUtils.prototype.isFunction = function(a) { | ||
| 46 | + return typeof a === 'function'; | ||
| 47 | +}; | ||
| 29 | function D3ScatterPlot(placeholderSelector, data, config){ | 48 | function D3ScatterPlot(placeholderSelector, data, config){ |
| 30 | this.utils = new D3ScatterPlotUtils(); | 49 | this.utils = new D3ScatterPlotUtils(); |
| 31 | this.placeholderSelector = placeholderSelector; | 50 | this.placeholderSelector = placeholderSelector; |
| @@ -42,12 +61,14 @@ function D3ScatterPlot(placeholderSelector, data, config){ | @@ -42,12 +61,14 @@ function D3ScatterPlot(placeholderSelector, data, config){ | ||
| 42 | x:{// X axis config | 61 | x:{// X axis config |
| 43 | label: 'X', // axis label | 62 | label: 'X', // axis label |
| 44 | value: function(d) { return d[0] }, // x value accessor | 63 | value: function(d) { return d[0] }, // x value accessor |
| 45 | - orient: "bottom" | 64 | + orient: "bottom", |
| 65 | + scale: "linear" | ||
| 46 | }, | 66 | }, |
| 47 | y:{// Y axis config | 67 | y:{// Y axis config |
| 48 | label: 'Y', // axis label | 68 | label: 'Y', // axis label |
| 49 | value: function(d) { return d[1] }, // y value accessor | 69 | value: function(d) { return d[1] }, // y value accessor |
| 50 | - orient: "left" | 70 | + orient: "left", |
| 71 | + scale: "linear" | ||
| 51 | }, | 72 | }, |
| 52 | dot:{ | 73 | dot:{ |
| 53 | radius: 2, | 74 | radius: 2, |
| @@ -64,6 +85,8 @@ function D3ScatterPlot(placeholderSelector, data, config){ | @@ -64,6 +85,8 @@ function D3ScatterPlot(placeholderSelector, data, config){ | ||
| 64 | this.setConfig(config); | 85 | this.setConfig(config); |
| 65 | } | 86 | } |
| 66 | 87 | ||
| 88 | + this.init(); | ||
| 89 | + | ||
| 67 | } | 90 | } |
| 68 | 91 | ||
| 69 | D3ScatterPlot.prototype.setData = function (data){ | 92 | D3ScatterPlot.prototype.setData = function (data){ |
| @@ -138,7 +161,7 @@ D3ScatterPlot.prototype.setupX = function (){ | @@ -138,7 +161,7 @@ D3ScatterPlot.prototype.setupX = function (){ | ||
| 138 | * axis - sets up axis | 161 | * axis - sets up axis |
| 139 | */ | 162 | */ |
| 140 | x.value = conf.value; | 163 | x.value = conf.value; |
| 141 | - x.scale = d3.scale.linear().range([0, plot.width]); | 164 | + x.scale = d3.scale[conf.scale]().range([0, plot.width]); |
| 142 | x.map = function(d) { return x.scale(x.value(d));}; | 165 | x.map = function(d) { return x.scale(x.value(d));}; |
| 143 | x.axis = d3.svg.axis().scale(x.scale).orient(conf.orient); | 166 | x.axis = d3.svg.axis().scale(x.scale).orient(conf.orient); |
| 144 | var data = this.data; | 167 | var data = this.data; |
| @@ -160,7 +183,7 @@ D3ScatterPlot.prototype.setupY = function (){ | @@ -160,7 +183,7 @@ D3ScatterPlot.prototype.setupY = function (){ | ||
| 160 | * axis - sets up axis | 183 | * axis - sets up axis |
| 161 | */ | 184 | */ |
| 162 | y.value = conf.value; | 185 | y.value = conf.value; |
| 163 | - y.scale = d3.scale.linear().range([plot.height, 0]); | 186 | + y.scale = d3.scale[conf.scale]().range([plot.height, 0]); |
| 164 | y.map = function(d) { return y.scale(y.value(d));}; | 187 | y.map = function(d) { return y.scale(y.value(d));}; |
| 165 | y.axis = d3.svg.axis().scale(y.scale).orient(conf.orient); | 188 | y.axis = d3.svg.axis().scale(y.scale).orient(conf.orient); |
| 166 | 189 | ||
| @@ -169,10 +192,10 @@ D3ScatterPlot.prototype.setupY = function (){ | @@ -169,10 +192,10 @@ D3ScatterPlot.prototype.setupY = function (){ | ||
| 169 | plot.y.scale.domain([d3.min(data, plot.y.value)-1, d3.max(data, plot.y.value)+1]); | 192 | plot.y.scale.domain([d3.min(data, plot.y.value)-1, d3.max(data, plot.y.value)+1]); |
| 170 | }; | 193 | }; |
| 171 | 194 | ||
| 172 | -D3ScatterPlot.prototype.drawPlot = function (){ | 195 | +D3ScatterPlot.prototype.draw = function (){ |
| 173 | this.drawAxisX(); | 196 | this.drawAxisX(); |
| 174 | this.drawAxisY(); | 197 | this.drawAxisY(); |
| 175 | - this.drawDots(); | 198 | + this.update(); |
| 176 | }; | 199 | }; |
| 177 | D3ScatterPlot.prototype.drawAxisX = function (){ | 200 | D3ScatterPlot.prototype.drawAxisX = function (){ |
| 178 | var self = this; | 201 | var self = this; |
| @@ -206,34 +229,44 @@ D3ScatterPlot.prototype.drawAxisY = function (){ | @@ -206,34 +229,44 @@ D3ScatterPlot.prototype.drawAxisY = function (){ | ||
| 206 | }; | 229 | }; |
| 207 | 230 | ||
| 208 | 231 | ||
| 209 | -D3ScatterPlot.prototype.drawDots = function (){ | 232 | +D3ScatterPlot.prototype.update = function (){ |
| 210 | var self = this; | 233 | var self = this; |
| 211 | var plot = self.plot; | 234 | var plot = self.plot; |
| 212 | var data = this.data; | 235 | var data = this.data; |
| 213 | var dots = self.svgG.selectAll(".mw-dot") | 236 | var dots = self.svgG.selectAll(".mw-dot") |
| 214 | - .data(data) | ||
| 215 | - .enter().append("circle") | ||
| 216 | - .attr("class", "mw-dot") | ||
| 217 | - .attr("r", self.config.dot.radius) | 237 | + .data(data); |
| 238 | + | ||
| 239 | + dots.enter().append("circle") | ||
| 240 | + .attr("class", "mw-dot"); | ||
| 241 | + | ||
| 242 | + | ||
| 243 | + dots.attr("r", self.config.dot.radius) | ||
| 218 | .attr("cx", plot.x.map) | 244 | .attr("cx", plot.x.map) |
| 219 | .attr("cy", plot.y.map); | 245 | .attr("cy", plot.y.map); |
| 220 | 246 | ||
| 221 | if(plot.dot.color){ | 247 | if(plot.dot.color){ |
| 222 | dots.style("fill", plot.dot.color) | 248 | dots.style("fill", plot.dot.color) |
| 223 | } | 249 | } |
| 250 | + dots.exit().remove(); | ||
| 224 | 251 | ||
| 225 | }; | 252 | }; |
| 226 | 253 | ||
| 227 | D3ScatterPlot.prototype.initSvg = function (){ | 254 | D3ScatterPlot.prototype.initSvg = function (){ |
| 228 | var self = this; | 255 | var self = this; |
| 229 | var config = this.config; | 256 | var config = this.config; |
| 230 | - | ||
| 231 | - | ||
| 232 | - | 257 | + |
| 233 | var width = self.plot.width+ config.margin.left + config.margin.right; | 258 | var width = self.plot.width+ config.margin.left + config.margin.right; |
| 234 | var height = self.plot.height+ config.margin.top + config.margin.bottom; | 259 | var height = self.plot.height+ config.margin.top + config.margin.bottom; |
| 235 | var aspect = width / height; | 260 | var aspect = width / height; |
| 236 | - self.svg = d3.select(self.placeholderSelector).append("svg") | 261 | + |
| 262 | + self.svg = d3.select(self.placeholderSelector).select("svg"); | ||
| 263 | + if(!self.svg.empty()){ | ||
| 264 | + self.svg.remove(); | ||
| 265 | + | ||
| 266 | + } | ||
| 267 | + self.svg = d3.select(self.placeholderSelector).append("svg"); | ||
| 268 | + | ||
| 269 | + self.svg | ||
| 237 | .attr("width", width) | 270 | .attr("width", width) |
| 238 | .attr("height", height) | 271 | .attr("height", height) |
| 239 | .attr("viewBox", "0 0 "+" "+width+" "+height) | 272 | .attr("viewBox", "0 0 "+" "+width+" "+height) |
| @@ -255,7 +288,7 @@ D3ScatterPlot.prototype.init = function (){ | @@ -255,7 +288,7 @@ D3ScatterPlot.prototype.init = function (){ | ||
| 255 | var self = this; | 288 | var self = this; |
| 256 | self.initPlot(); | 289 | self.initPlot(); |
| 257 | self.initSvg(); | 290 | self.initSvg(); |
| 258 | - self.drawPlot(); | 291 | + self.draw(); |
| 259 | 292 | ||
| 260 | }; | 293 | }; |
| 261 | 294 |
bower_components/d3-scatterplot/dist/d3-scatterplot.min.js
| 1 | -function D3ScatterPlotUtils(){}D3ScatterPlotUtils.prototype.deepExtend=function(t){var e=this;t=t||{};for(var r=1;r<arguments.length;r++){var o=arguments[r];if(o)for(var n in o)o.hasOwnProperty(n)&&("object"==typeof o[n]?t[n]=e.deepExtend(t[n],o[n]):t[n]=o[n])}return t}; | ||
| 2 | -function D3ScatterPlot(t,o,e){this.utils=new D3ScatterPlotUtils,this.placeholderSelector=t,this.svg=null,this.defaultConfig={width:0,height:0,margin:{left:50,right:30,top:30,bottom:50},x:{label:"X",value:function(t){return t[0]},orient:"bottom"},y:{label:"Y",value:function(t){return t[1]},orient:"left"},dot:{radius:2,color:function(t){return t[0]*t[1]},d3ColorCategory:"category10"}},o&&this.setData(o),e&&this.setConfig(e)}D3ScatterPlot.prototype.setData=function(t){return this.data=t,this},D3ScatterPlot.prototype.setConfig=function(t){return this.config=this.utils.deepExtend({},this.defaultConfig,t),this},D3ScatterPlot.prototype.initPlot=function(){var t=this,o=this.config.margin,e=this.config;this.plot={x:{},y:{},dot:{color:null}};var a=e.width,i=d3.select(this.placeholderSelector).node();a||(a=i.getBoundingClientRect().width);var r=e.height;r||(r=i.getBoundingClientRect().height),this.plot.width=a-o.left-o.right,this.plot.height=r-o.top-o.bottom,this.setupX(),this.setupY(),e.dot.d3ColorCategory&&(this.plot.dot.colorCategory=d3.scale[e.dot.d3ColorCategory]());var l=e.dot.color;return l&&(this.plot.dot.colorValue=l,"string"==typeof l||l instanceof String?this.plot.dot.color=l:this.plot.dot.colorCategory&&(this.plot.dot.color=function(o){return t.plot.dot.colorCategory(t.plot.dot.colorValue(o))})),this},D3ScatterPlot.prototype.setupX=function(){var t=this.plot,o=t.x,e=this.config.x;o.value=e.value,o.scale=d3.scale.linear().range([0,t.width]),o.map=function(t){return o.scale(o.value(t))},o.axis=d3.svg.axis().scale(o.scale).orient(e.orient);var a=this.data;t.x.scale.domain([d3.min(a,t.x.value)-1,d3.max(a,t.x.value)+1])},D3ScatterPlot.prototype.setupY=function(){var t=this.plot,o=t.y,e=this.config.y;o.value=e.value,o.scale=d3.scale.linear().range([t.height,0]),o.map=function(t){return o.scale(o.value(t))},o.axis=d3.svg.axis().scale(o.scale).orient(e.orient);var a=this.data;t.y.scale.domain([d3.min(a,t.y.value)-1,d3.max(a,t.y.value)+1])},D3ScatterPlot.prototype.drawPlot=function(){this.drawAxisX(),this.drawAxisY(),this.drawDots()},D3ScatterPlot.prototype.drawAxisX=function(){var t=this,o=t.plot,e=this.config.x;t.svgG.append("g").attr("class","mw-axis mw-axis-x").attr("transform","translate(0,"+o.height+")").call(o.x.axis).append("text").attr("class","mw-label").attr("transform","translate("+o.width/2+","+t.config.margin.bottom+")").attr("dy","-1em").style("text-anchor","middle").text(e.label)},D3ScatterPlot.prototype.drawAxisY=function(){var t=this,o=t.plot,e=this.config.y;t.svgG.append("g").attr("class","mw-axis mw-axis-y").call(o.y.axis).append("text").attr("class","mw-label").attr("transform","translate("+-t.config.margin.left+","+o.height/2+")rotate(-90)").attr("dy","1em").style("text-anchor","middle").text(e.label)},D3ScatterPlot.prototype.drawDots=function(){var t=this,o=t.plot,e=this.data,a=t.svgG.selectAll(".mw-dot").data(e).enter().append("circle").attr("class","mw-dot").attr("r",t.config.dot.radius).attr("cx",o.x.map).attr("cy",o.y.map);o.dot.color&&a.style("fill",o.dot.color)},D3ScatterPlot.prototype.initSvg=function(){var t=this,o=this.config,e=t.plot.width+o.margin.left+o.margin.right,a=t.plot.height+o.margin.top+o.margin.bottom;t.svg=d3.select(t.placeholderSelector).append("svg").attr("width",e).attr("height",a).attr("viewBox","0 0 "+e+" "+a).attr("preserveAspectRatio","xMidYMid meet").attr("class","mw-d3-scatterplot"),t.svgG=t.svg.append("g").attr("transform","translate("+o.margin.left+","+o.margin.top+")"),o.width&&!o.height||d3.select(window).on("resize",function(){})},D3ScatterPlot.prototype.init=function(){var t=this;t.initPlot(),t.initSvg(),t.drawPlot()}; | ||
| 3 | \ No newline at end of file | 1 | \ No newline at end of file |
| 2 | +function D3ScatterPlotUtils(){}D3ScatterPlotUtils.prototype.deepExtend=function(t){var r=this;!t&&arguments.length>1&&Array.isArray(arguments[1])&&(t=[]),t=t||{};for(var e=1;e<arguments.length;e++){var o=arguments[e];if(o)for(var n in o)if(o.hasOwnProperty(n)){var i=Array.isArray(t[n]),a=r.isObject(t[n]),c=r.isObject(o[n]);a&&!i&&c?r.deepExtend(t[n],o[n]):t[n]=o[n]}}return t},D3ScatterPlotUtils.prototype.isObject=function(t){return null!==t&&"object"==typeof t},D3ScatterPlotUtils.prototype.isNumber=function(t){return!isNaN(t)&&"number"==typeof t},D3ScatterPlotUtils.prototype.isFunction=function(t){return"function"==typeof t}; | ||
| 3 | +function D3ScatterPlot(t,e,o){this.utils=new D3ScatterPlotUtils,this.placeholderSelector=t,this.svg=null,this.defaultConfig={width:0,height:0,margin:{left:50,right:30,top:30,bottom:50},x:{label:"X",value:function(t){return t[0]},orient:"bottom",scale:"linear"},y:{label:"Y",value:function(t){return t[1]},orient:"left",scale:"linear"},dot:{radius:2,color:function(t){return t[0]*t[1]},d3ColorCategory:"category10"}},e&&this.setData(e),o&&this.setConfig(o),this.init()}D3ScatterPlot.prototype.setData=function(t){return this.data=t,this},D3ScatterPlot.prototype.setConfig=function(t){return this.config=this.utils.deepExtend({},this.defaultConfig,t),this},D3ScatterPlot.prototype.initPlot=function(){var t=this,e=this.config.margin,o=this.config;this.plot={x:{},y:{},dot:{color:null}};var a=o.width,i=d3.select(this.placeholderSelector).node();a||(a=i.getBoundingClientRect().width);var r=o.height;r||(r=i.getBoundingClientRect().height),this.plot.width=a-e.left-e.right,this.plot.height=r-e.top-e.bottom,this.setupX(),this.setupY(),o.dot.d3ColorCategory&&(this.plot.dot.colorCategory=d3.scale[o.dot.d3ColorCategory]());var l=o.dot.color;return l&&(this.plot.dot.colorValue=l,"string"==typeof l||l instanceof String?this.plot.dot.color=l:this.plot.dot.colorCategory&&(this.plot.dot.color=function(e){return t.plot.dot.colorCategory(t.plot.dot.colorValue(e))})),this},D3ScatterPlot.prototype.setupX=function(){var t=this.plot,e=t.x,o=this.config.x;e.value=o.value,e.scale=d3.scale[o.scale]().range([0,t.width]),e.map=function(t){return e.scale(e.value(t))},e.axis=d3.svg.axis().scale(e.scale).orient(o.orient);var a=this.data;t.x.scale.domain([d3.min(a,t.x.value)-1,d3.max(a,t.x.value)+1])},D3ScatterPlot.prototype.setupY=function(){var t=this.plot,e=t.y,o=this.config.y;e.value=o.value,e.scale=d3.scale[o.scale]().range([t.height,0]),e.map=function(t){return e.scale(e.value(t))},e.axis=d3.svg.axis().scale(e.scale).orient(o.orient);var a=this.data;t.y.scale.domain([d3.min(a,t.y.value)-1,d3.max(a,t.y.value)+1])},D3ScatterPlot.prototype.draw=function(){this.drawAxisX(),this.drawAxisY(),this.update()},D3ScatterPlot.prototype.drawAxisX=function(){var t=this,e=t.plot,o=this.config.x;t.svgG.append("g").attr("class","mw-axis mw-axis-x").attr("transform","translate(0,"+e.height+")").call(e.x.axis).append("text").attr("class","mw-label").attr("transform","translate("+e.width/2+","+t.config.margin.bottom+")").attr("dy","-1em").style("text-anchor","middle").text(o.label)},D3ScatterPlot.prototype.drawAxisY=function(){var t=this,e=t.plot,o=this.config.y;t.svgG.append("g").attr("class","mw-axis mw-axis-y").call(e.y.axis).append("text").attr("class","mw-label").attr("transform","translate("+-t.config.margin.left+","+e.height/2+")rotate(-90)").attr("dy","1em").style("text-anchor","middle").text(o.label)},D3ScatterPlot.prototype.update=function(){var t=this,e=t.plot,o=this.data,a=t.svgG.selectAll(".mw-dot").data(o);a.enter().append("circle").attr("class","mw-dot"),a.attr("r",t.config.dot.radius).attr("cx",e.x.map).attr("cy",e.y.map),e.dot.color&&a.style("fill",e.dot.color),a.exit().remove()},D3ScatterPlot.prototype.initSvg=function(){var t=this,e=this.config,o=t.plot.width+e.margin.left+e.margin.right,a=t.plot.height+e.margin.top+e.margin.bottom;t.svg=d3.select(t.placeholderSelector).select("svg"),t.svg.empty()||t.svg.remove(),t.svg=d3.select(t.placeholderSelector).append("svg"),t.svg.attr("width",o).attr("height",a).attr("viewBox","0 0 "+o+" "+a).attr("preserveAspectRatio","xMidYMid meet").attr("class","mw-d3-scatterplot"),t.svgG=t.svg.append("g").attr("transform","translate("+e.margin.left+","+e.margin.top+")"),e.width&&!e.height||d3.select(window).on("resize",function(){})},D3ScatterPlot.prototype.init=function(){var t=this;t.initPlot(),t.initSvg(),t.draw()}; | ||
| 4 | \ No newline at end of file | 4 | \ No newline at end of file |
bower_components/d3-scatterplot/src/d3-scatterplot-utils.js
| 1 | function D3ScatterPlotUtils(){} | 1 | function D3ScatterPlotUtils(){} |
| 2 | 2 | ||
| 3 | // usage example deepExtend({}, objA, objB); => should work similar to $.extend(true, {}, objA, objB); | 3 | // usage example deepExtend({}, objA, objB); => should work similar to $.extend(true, {}, objA, objB); |
| 4 | -D3ScatterPlotUtils.prototype.deepExtend = function(out) { //TODO consider using jquery / lo-dash / underscore / ECMA6 ; fallbacks? | 4 | +D3ScatterPlotUtils.prototype.deepExtend = function (out) { |
| 5 | 5 | ||
| 6 | - var utils =this; | 6 | + var utils = this; |
| 7 | + var emptyOut = {}; | ||
| 8 | + | ||
| 9 | + | ||
| 10 | + if (!out && arguments.length > 1 && Array.isArray(arguments[1])) { | ||
| 11 | + out = []; | ||
| 12 | + } | ||
| 7 | out = out || {}; | 13 | out = out || {}; |
| 8 | 14 | ||
| 9 | for (var i = 1; i < arguments.length; i++) { | 15 | for (var i = 1; i < arguments.length; i++) { |
| 10 | - var obj = arguments[i]; | ||
| 11 | - | ||
| 12 | - if (!obj) | 16 | + var source = arguments[i]; |
| 17 | + if (!source) | ||
| 13 | continue; | 18 | continue; |
| 14 | 19 | ||
| 15 | - for (var key in obj) { | ||
| 16 | - if (obj.hasOwnProperty(key)) { | ||
| 17 | - if (typeof obj[key] === 'object') | ||
| 18 | - out[key] = utils.deepExtend(out[key], obj[key]); | ||
| 19 | - else | ||
| 20 | - out[key] = obj[key]; | 20 | + for (var key in source) { |
| 21 | + if (!source.hasOwnProperty(key)) { | ||
| 22 | + continue; | ||
| 23 | + } | ||
| 24 | + var isArray = Array.isArray(out[key]); | ||
| 25 | + var isObject = utils.isObject(out[key]); | ||
| 26 | + var srcObj = utils.isObject(source[key]); | ||
| 27 | + | ||
| 28 | + if (isObject && !isArray && srcObj) { | ||
| 29 | + utils.deepExtend(out[key], source[key]); | ||
| 30 | + } else { | ||
| 31 | + out[key] = source[key]; | ||
| 21 | } | 32 | } |
| 22 | } | 33 | } |
| 23 | } | 34 | } |
| @@ -25,3 +36,12 @@ D3ScatterPlotUtils.prototype.deepExtend = function(out) { //TODO consider using | @@ -25,3 +36,12 @@ D3ScatterPlotUtils.prototype.deepExtend = function(out) { //TODO consider using | ||
| 25 | return out; | 36 | return out; |
| 26 | }; | 37 | }; |
| 27 | 38 | ||
| 39 | +D3ScatterPlotUtils.prototype.isObject = function(a) { | ||
| 40 | + return a !== null && typeof a === 'object'; | ||
| 41 | +}; | ||
| 42 | +D3ScatterPlotUtils.prototype.isNumber = function(a) { | ||
| 43 | + return !isNaN(a) && typeof a === 'number'; | ||
| 44 | +}; | ||
| 45 | +D3ScatterPlotUtils.prototype.isFunction = function(a) { | ||
| 46 | + return typeof a === 'function'; | ||
| 47 | +}; | ||
| 28 | \ No newline at end of file | 48 | \ No newline at end of file |
bower_components/d3-scatterplot/src/d3-scatterplot.js
| @@ -14,12 +14,14 @@ function D3ScatterPlot(placeholderSelector, data, config){ | @@ -14,12 +14,14 @@ function D3ScatterPlot(placeholderSelector, data, config){ | ||
| 14 | x:{// X axis config | 14 | x:{// X axis config |
| 15 | label: 'X', // axis label | 15 | label: 'X', // axis label |
| 16 | value: function(d) { return d[0] }, // x value accessor | 16 | value: function(d) { return d[0] }, // x value accessor |
| 17 | - orient: "bottom" | 17 | + orient: "bottom", |
| 18 | + scale: "linear" | ||
| 18 | }, | 19 | }, |
| 19 | y:{// Y axis config | 20 | y:{// Y axis config |
| 20 | label: 'Y', // axis label | 21 | label: 'Y', // axis label |
| 21 | value: function(d) { return d[1] }, // y value accessor | 22 | value: function(d) { return d[1] }, // y value accessor |
| 22 | - orient: "left" | 23 | + orient: "left", |
| 24 | + scale: "linear" | ||
| 23 | }, | 25 | }, |
| 24 | dot:{ | 26 | dot:{ |
| 25 | radius: 2, | 27 | radius: 2, |
| @@ -36,6 +38,8 @@ function D3ScatterPlot(placeholderSelector, data, config){ | @@ -36,6 +38,8 @@ function D3ScatterPlot(placeholderSelector, data, config){ | ||
| 36 | this.setConfig(config); | 38 | this.setConfig(config); |
| 37 | } | 39 | } |
| 38 | 40 | ||
| 41 | + this.init(); | ||
| 42 | + | ||
| 39 | } | 43 | } |
| 40 | 44 | ||
| 41 | D3ScatterPlot.prototype.setData = function (data){ | 45 | D3ScatterPlot.prototype.setData = function (data){ |
| @@ -110,7 +114,7 @@ D3ScatterPlot.prototype.setupX = function (){ | @@ -110,7 +114,7 @@ D3ScatterPlot.prototype.setupX = function (){ | ||
| 110 | * axis - sets up axis | 114 | * axis - sets up axis |
| 111 | */ | 115 | */ |
| 112 | x.value = conf.value; | 116 | x.value = conf.value; |
| 113 | - x.scale = d3.scale.linear().range([0, plot.width]); | 117 | + x.scale = d3.scale[conf.scale]().range([0, plot.width]); |
| 114 | x.map = function(d) { return x.scale(x.value(d));}; | 118 | x.map = function(d) { return x.scale(x.value(d));}; |
| 115 | x.axis = d3.svg.axis().scale(x.scale).orient(conf.orient); | 119 | x.axis = d3.svg.axis().scale(x.scale).orient(conf.orient); |
| 116 | var data = this.data; | 120 | var data = this.data; |
| @@ -132,7 +136,7 @@ D3ScatterPlot.prototype.setupY = function (){ | @@ -132,7 +136,7 @@ D3ScatterPlot.prototype.setupY = function (){ | ||
| 132 | * axis - sets up axis | 136 | * axis - sets up axis |
| 133 | */ | 137 | */ |
| 134 | y.value = conf.value; | 138 | y.value = conf.value; |
| 135 | - y.scale = d3.scale.linear().range([plot.height, 0]); | 139 | + y.scale = d3.scale[conf.scale]().range([plot.height, 0]); |
| 136 | y.map = function(d) { return y.scale(y.value(d));}; | 140 | y.map = function(d) { return y.scale(y.value(d));}; |
| 137 | y.axis = d3.svg.axis().scale(y.scale).orient(conf.orient); | 141 | y.axis = d3.svg.axis().scale(y.scale).orient(conf.orient); |
| 138 | 142 | ||
| @@ -141,10 +145,10 @@ D3ScatterPlot.prototype.setupY = function (){ | @@ -141,10 +145,10 @@ D3ScatterPlot.prototype.setupY = function (){ | ||
| 141 | plot.y.scale.domain([d3.min(data, plot.y.value)-1, d3.max(data, plot.y.value)+1]); | 145 | plot.y.scale.domain([d3.min(data, plot.y.value)-1, d3.max(data, plot.y.value)+1]); |
| 142 | }; | 146 | }; |
| 143 | 147 | ||
| 144 | -D3ScatterPlot.prototype.drawPlot = function (){ | 148 | +D3ScatterPlot.prototype.draw = function (){ |
| 145 | this.drawAxisX(); | 149 | this.drawAxisX(); |
| 146 | this.drawAxisY(); | 150 | this.drawAxisY(); |
| 147 | - this.drawDots(); | 151 | + this.update(); |
| 148 | }; | 152 | }; |
| 149 | D3ScatterPlot.prototype.drawAxisX = function (){ | 153 | D3ScatterPlot.prototype.drawAxisX = function (){ |
| 150 | var self = this; | 154 | var self = this; |
| @@ -178,34 +182,44 @@ D3ScatterPlot.prototype.drawAxisY = function (){ | @@ -178,34 +182,44 @@ D3ScatterPlot.prototype.drawAxisY = function (){ | ||
| 178 | }; | 182 | }; |
| 179 | 183 | ||
| 180 | 184 | ||
| 181 | -D3ScatterPlot.prototype.drawDots = function (){ | 185 | +D3ScatterPlot.prototype.update = function (){ |
| 182 | var self = this; | 186 | var self = this; |
| 183 | var plot = self.plot; | 187 | var plot = self.plot; |
| 184 | var data = this.data; | 188 | var data = this.data; |
| 185 | var dots = self.svgG.selectAll(".mw-dot") | 189 | var dots = self.svgG.selectAll(".mw-dot") |
| 186 | - .data(data) | ||
| 187 | - .enter().append("circle") | ||
| 188 | - .attr("class", "mw-dot") | ||
| 189 | - .attr("r", self.config.dot.radius) | 190 | + .data(data); |
| 191 | + | ||
| 192 | + dots.enter().append("circle") | ||
| 193 | + .attr("class", "mw-dot"); | ||
| 194 | + | ||
| 195 | + | ||
| 196 | + dots.attr("r", self.config.dot.radius) | ||
| 190 | .attr("cx", plot.x.map) | 197 | .attr("cx", plot.x.map) |
| 191 | .attr("cy", plot.y.map); | 198 | .attr("cy", plot.y.map); |
| 192 | 199 | ||
| 193 | if(plot.dot.color){ | 200 | if(plot.dot.color){ |
| 194 | dots.style("fill", plot.dot.color) | 201 | dots.style("fill", plot.dot.color) |
| 195 | } | 202 | } |
| 203 | + dots.exit().remove(); | ||
| 196 | 204 | ||
| 197 | }; | 205 | }; |
| 198 | 206 | ||
| 199 | D3ScatterPlot.prototype.initSvg = function (){ | 207 | D3ScatterPlot.prototype.initSvg = function (){ |
| 200 | var self = this; | 208 | var self = this; |
| 201 | var config = this.config; | 209 | var config = this.config; |
| 202 | - | ||
| 203 | - | ||
| 204 | - | 210 | + |
| 205 | var width = self.plot.width+ config.margin.left + config.margin.right; | 211 | var width = self.plot.width+ config.margin.left + config.margin.right; |
| 206 | var height = self.plot.height+ config.margin.top + config.margin.bottom; | 212 | var height = self.plot.height+ config.margin.top + config.margin.bottom; |
| 207 | var aspect = width / height; | 213 | var aspect = width / height; |
| 208 | - self.svg = d3.select(self.placeholderSelector).append("svg") | 214 | + |
| 215 | + self.svg = d3.select(self.placeholderSelector).select("svg"); | ||
| 216 | + if(!self.svg.empty()){ | ||
| 217 | + self.svg.remove(); | ||
| 218 | + | ||
| 219 | + } | ||
| 220 | + self.svg = d3.select(self.placeholderSelector).append("svg"); | ||
| 221 | + | ||
| 222 | + self.svg | ||
| 209 | .attr("width", width) | 223 | .attr("width", width) |
| 210 | .attr("height", height) | 224 | .attr("height", height) |
| 211 | .attr("viewBox", "0 0 "+" "+width+" "+height) | 225 | .attr("viewBox", "0 0 "+" "+width+" "+height) |
| @@ -227,7 +241,7 @@ D3ScatterPlot.prototype.init = function (){ | @@ -227,7 +241,7 @@ D3ScatterPlot.prototype.init = function (){ | ||
| 227 | var self = this; | 241 | var self = this; |
| 228 | self.initPlot(); | 242 | self.initPlot(); |
| 229 | self.initSvg(); | 243 | self.initSvg(); |
| 230 | - self.drawPlot(); | 244 | + self.draw(); |
| 231 | 245 | ||
| 232 | }; | 246 | }; |
| 233 | 247 |
datalets/scatterplot-datalet/scatterplot-datalet.html
| @@ -24,18 +24,12 @@ | @@ -24,18 +24,12 @@ | ||
| 24 | presentData: function () { | 24 | presentData: function () { |
| 25 | 25 | ||
| 26 | var self =this; | 26 | var self =this; |
| 27 | - var scatterSeries = []; | ||
| 28 | - var series = []; | ||
| 29 | - var point = []; | ||
| 30 | - | 27 | + var data = []; |
| 31 | for (var j = 0; j < this.data[0]["data"].length; j++) { | 28 | for (var j = 0; j < this.data[0]["data"].length; j++) { |
| 32 | point = [this.data[0].data[j], this.data[1].data[j]]; | 29 | point = [this.data[0].data[j], this.data[1].data[j]]; |
| 33 | - series.push(point); | 30 | + data.push(point); |
| 34 | } | 31 | } |
| 35 | 32 | ||
| 36 | - scatterSeries.push({data: series}); | ||
| 37 | - | ||
| 38 | - this.properties.series = scatterSeries; | ||
| 39 | this._component.legend = false; | 33 | this._component.legend = false; |
| 40 | 34 | ||
| 41 | var conf = { | 35 | var conf = { |
| @@ -52,7 +46,7 @@ | @@ -52,7 +46,7 @@ | ||
| 52 | } | 46 | } |
| 53 | }; | 47 | }; |
| 54 | 48 | ||
| 55 | - var plot = new D3ScatterPlot("#scatterplot-placeholder", this.properties.series[0].data, conf); | 49 | + var plot = new D3ScatterPlot("#scatterplot-placeholder", data, conf); |
| 56 | plot.init(); | 50 | plot.init(); |
| 57 | } | 51 | } |
| 58 | }; | 52 | }; |