/*global d3,dpl,pyfy*/ var options = { drift : 0, vol : 20, randomize : function() { delete q.cache[b.ID]; chart.render(); b.args.random.arg("bump",0); chart.render(500); } }; var zoom = d3.behavior.zoom(), q = pyfy.query(), a=pyfy.flow(APPL), b=a.lognorm(0.2,0.0); var chart = dpl.chart(d3.select("svg")) .setTitle("chart","APPL - Brownian Bridge Experiment") .scale("x",d3.time.scale()); var path = chart.graph .append("path") .classed("brownian",true); var circle = chart.graph .selectAll("circle") .data(q.val(a)) .enter() .append("circle") .attr("r",5) .classed("points",true) .call(dpl.fitScale("x")); chart.on("resize.autofit",resize); function resize() { var domain = chart.scale("x").domain(), first = new Date(domain[0].getFullYear()-1,1,1); var points = []; points = d3.range(first,domain[1],pyfy.util.DAYMS *100 / Math.round(zoom.scale())) .filter(function(d) { return d > domain[0] && d < domain[1]; }); q.get(b,points); var data = q.val(b) .filter(function(d) { return d.x > domain[0] && d.x < domain[1]; }); path.datum(data) .call(dpl.fitScale("y",function(d) { return [d[0]*0.95,d[1]*1.05]; })); } chart.render(); zoom.x(chart.scale("x")) .y(chart.scale("y")) .on("zoom", chart.render); chart.g.call(zoom); var gui = new dat.GUI() gui.add(options, 'vol', 0, 100,0.5).onChange(changeArg("vol")); gui.add(options,'drift',0,20,0.5).onChange(changeArg("drift")); gui.add(options, 'randomize', 0, 100); function changeArg(name) { return function() { b.arg(name,options[name]/100); if (q.cache[b.args.random.ID]) { q.val(b,Object.keys(q.cache[b.args.random.ID].values).map(function(d) { return +d; })); } chart.render(); }; }