not really known
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

653 lines
32 KiB

! function(t) {
if ("object" == typeof exports && "undefined" != typeof module) module.exports = t();
else if ("function" == typeof define && define.amd) define([], t);
else {
var e;
e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this, e.functionPlot = t()
}
}(function() {
return function t(e, n, r) {
function i(a, o) {
if (!n[a]) {
if (!e[a]) {
var l = "function" == typeof require && require;
if (!o && l) return l(a, !0);
if (s) return s(a, !0);
var c = new Error("Cannot find module '" + a + "'");
throw c.code = "MODULE_NOT_FOUND", c
}
var u = n[a] = {
exports: {}
};
e[a][0].call(u.exports, function(t) {
var n = e[a][1][t];
return i(n ? n : t)
}, u, u.exports, t, e, n, r)
}
return n[a].exports
}
for (var s = "function" == typeof require && require, a = 0; a < r.length; a++) i(r[a]);
return i
}({
1: [function(t, e) {
"use strict";
var n, r, i = window.d3,
s = t("events"),
a = t("extend"),
o = t("./lib/tip"),
l = t("./lib/utils"),
c = t("./lib/helper/"),
u = l.assert;
e.exports = function(t) {
function e() {
this.id = t.target, this.linkedGraphs = [this], this.setVars(), this.build(), this.setUpEventListeners()
}
t = t || {}, t.data = t.data || [];
var l, h, p, f, d, v, m = i.svg.line().x(function(t) {
return d(t[0])
}).y(function(t) {
return v(t[1])
});
return e.prototype = Object.create(s.prototype), e.prototype.updateBounds = function() {
l = this.meta.width = (t.width || n.DEFAULT_WIDTH) - p.left - p.right, h = this.meta.height = (t.height || n.DEFAULT_HEIGHT) - p.top - p.bottom;
var e = this.meta.xDomain,
r = this.meta.yDomain,
s = i.format("s"),
a = i.format(".0r"),
o = function(t) {
return Math.abs(t) >= 1 ? s(t) : a(t)
};
d = this.meta.xScale = i.scale.linear().domain(e).range([0, l]), v = this.meta.yScale = i.scale.linear().domain(r).range([h, 0]), this.meta.xAxis = i.svg.axis().scale(d).orient("bottom").tickFormat(o), this.meta.yAxis = i.svg.axis().scale(v).orient("left").tickFormat(o)
}, e.prototype.setVars = function() {
var e = 10;
this.meta = {}, p = this.meta.margin = {
left: 30,
right: 30,
top: 20,
bottom: 20
}, f = this.meta.zoomBehavior = i.behavior.zoom();
var n = this.meta.xDomain = t.xDomain || [-e / 2, e / 2],
r = this.meta.yDomain = t.yDomain || [-e / 2, e / 2];
u(n[0] < n[1]), u(r[0] < r[1]), t.title && (this.meta.margin.top = 40), this.updateBounds()
}, e.prototype.build = function() {
var e = this.root = i.select(t.target).selectAll("svg").data([t]);
this.root.enter = e.enter().append("svg").attr("class", "function-plot").attr("font-size", this.getFontSize()), e.attr("width", l + p.left + p.right).attr("height", h + p.top + p.bottom), this.buildTitle(), this.buildLegend(), this.buildCanvas(), this.buildClip(), this.buildAxis(), this.buildContent();
var n = this.tip = o(a(t.tip, {
owner: this
}));
this.canvas.call(n), this.buildZoomHelper()
}, e.prototype.buildTitle = function() {
var e = this.root.selectAll("text.title").data(function(t) {
return [t.title].filter(Boolean)
});
e.enter().append("text").attr("class", "title").attr("y", p.top / 2).attr("x", p.left + l / 2).attr("font-size", 25).attr("text-anchor", "middle").attr("alignment-baseline", "middle").text(t.title), e.exit().remove()
}, e.prototype.buildLegend = function() {
this.root.enter.append("text").attr("class", "top-right-legend").attr("text-anchor", "end"), this.root.select(".top-right-legend").attr("y", p.top).attr("x", l + p.left)
}, e.prototype.buildCanvas = function() {
var e = this;
this.meta.zoomBehavior.x(d).y(v).scaleExtent([1e-5, 1 / 0]).on("zoom", function() {
e.emit("all:zoom", d, v)
});
var n = this.canvas = this.root.selectAll(".canvas").data(function(t) {
return [t]
});
this.canvas.enter = n.enter().append("g").attr("class", "canvas"), n.attr("transform", "translate(" + p.left + "," + p.top + ")").call(f).each(function() {
var e = i.select(this);
t.disableZoom && e.on(".zoom", null)
})
}, e.prototype.buildClip = function() {
var t = this.id,
e = this.canvas.enter.append("defs");
e.append("clipPath").attr("id", "function-plot-clip-" + t).append("rect").attr("class", "clip static-clip"), this.canvas.selectAll(".clip").attr("width", l).attr("height", h)
}, e.prototype.buildAxis = function() {
var t = this.canvas.enter;
t.append("g").attr("class", "x axis"), t.append("g").attr("class", "y axis"), this.canvas.select(".x.axis").attr("transform", "translate(0," + h + ")").call(this.meta.xAxis), this.canvas.select(".y.axis").call(this.meta.yAxis), this.canvas.selectAll(".axis path, .axis line").attr("fill", "none").attr("stroke", "black").attr("shape-rendering", "crispedges").attr("opacity", .1)
}, e.prototype.buildAxisLabel = function() {
var t, e, n = this.canvas;
t = n.selectAll("text.x.axis-label").data(function(t) {
return [t.xLabel].filter(Boolean)
}), t.enter().append("text").attr("class", "x axis-label").attr("text-anchor", "end"), t.attr("x", l).attr("y", h - 6).text(function(t) {
return t
}), t.exit().remove(), e = n.selectAll("text.y.axis-label").data(function(t) {
return [t.yLabel].filter(Boolean)
}), e.enter().append("text").attr("class", "y axis-label").attr("y", 6).attr("dy", ".75em").attr("text-anchor", "end").attr("transform", "rotate(-90)"), e.text(function(t) {
return t
}), e.exit().remove()
}, e.prototype.buildContent = function() {
var t = this,
e = this.canvas,
n = this.content = e.selectAll("g.content").data(function(t) {
return [t]
});
n.enter().append("g").attr("clip-path", "url(#function-plot-clip-" + this.id + ")").attr("class", "content");
var s = n.selectAll("path.y.origin").data([
[
[0, v.domain()[0]],
[0, v.domain()[1]]
]
]);
s.enter().append("path").attr("class", "y origin").attr("stroke", "#eee"), s.attr("d", m);
var o = n.selectAll("path.x.origin").data([
[
[d.domain()[0], 0],
[d.domain()[1], 0]
]
]);
o.enter().append("path").attr("class", "x origin").attr("stroke", "#eee"), o.attr("d", m);
var l = n.selectAll("g.graph").data(function(t) {
return t.data
});
l.enter().append("g").attr("class", "graph"), l.each(function(e, n) {
var s = a({
owner: t,
index: n
}, e.graphOptions),
o = s.type || "line";
i.select(this).call(r[o](s)), i.select(this).call(c(s))
})
}, e.prototype.buildZoomHelper = function() {
var t = this;
this.canvas.enter.append("rect").attr("class", "zoom-and-drag").style("fill", "none").style("pointer-events", "all"), this.canvas.select(".zoom-and-drag").attr("width", l).attr("height", h).on("mouseover", function() {
t.emit("all:mouseover")
}).on("mouseout", function() {
t.emit("all:mouseout")
}).on("mousemove", function() {
t.emit("all:mousemove")
})
}, e.prototype.addLink = function() {
for (var t = 0; t < arguments.length; t += 1) this.linkedGraphs.push(arguments[t])
}, e.prototype.getFontSize = function() {
var fontSize = Math.max(Math.max(l, h) / 60, 8)
if (fontSize > 15) {
fontSize = 15;
}
return fontSize
}, e.prototype.setUpEventListeners = function() {
var t = this,
e = {
mousemove: function(e, n) {
t.tip.move(e, n)
},
mouseover: function() {
t.tip.show()
},
mouseout: function() {
t.tip.hide()
},
draw: function() {
t.buildContent()
},
"zoom:scaleUpdate": function(t, e) {
f.x(d.domain(t.domain())).y(v.domain(e.domain()))
},
"tip:update": function(e, r, i) {
var s = t.root.datum().data[i],
a = s.title || "",
o = s.renderer || function(t, e) {
return t.toFixed(3) + ", " + e.toFixed(3)
},
l = [];
a && l.push(a), l.push(o(e, r)), t.root.select(".top-right-legend").attr("fill", n.COLORS[i]).text(l.join(" "))
}
},
r = {
mousemove: function() {
var e = i.mouse(t.root.select("rect.zoom-and-drag").node()),
n = d.invert(e[0]),
r = v.invert(e[1]);
t.linkedGraphs.forEach(function(t) {
t.emit("mousemove", n, r)
})
},
zoom: function(e, n) {
t.linkedGraphs.forEach(function(t, r) {
var i = t.canvas;
i.select(".x.axis").call(t.meta.xAxis), i.select(".y.axis").call(t.meta.yAxis), r && t.emit("zoom:scaleUpdate", e, n), t.emit("draw")
}), t.emit("all:mousemove")
}
};
Object.keys(e).forEach(function(n) {
t.on(n, e[n]), !r[n] && t.on("all:" + n, function() {
var e = Array.prototype.slice.call(arguments);
t.linkedGraphs.forEach(function(t) {
var r = e.slice();
r.unshift(n), t.emit.apply(t, r)
})
})
}), Object.keys(r).forEach(function(e) {
t.on("all:" + e, r[e])
})
}, new e
}, n = e.exports.constants = t("./lib/constants"), r = e.exports.types = t("./lib/types/")
}, {
"./lib/constants": 3,
"./lib/helper/": 6,
"./lib/tip": 7,
"./lib/types/": 8,
"./lib/utils": 11,
events: 2,
extend: 12
}],
2: [function(t, e) {
function n() {
this._events = this._events || {}, this._maxListeners = this._maxListeners || void 0
}
function r(t) {
return "function" == typeof t
}
function i(t) {
return "number" == typeof t
}
function s(t) {
return "object" == typeof t && null !== t
}
function a(t) {
return void 0 === t
}
e.exports = n, n.EventEmitter = n, n.prototype._events = void 0, n.prototype._maxListeners = void 0, n.defaultMaxListeners = 10, n.prototype.setMaxListeners = function(t) {
if (!i(t) || 0 > t || isNaN(t)) throw TypeError("n must be a positive number");
return this._maxListeners = t, this
}, n.prototype.emit = function(t) {
var e, n, i, o, l, c;
if (this._events || (this._events = {}), "error" === t && (!this._events.error || s(this._events.error) && !this._events.error.length)) {
if (e = arguments[1], e instanceof Error) throw e;
throw TypeError('Uncaught, unspecified "error" event.')
}
if (n = this._events[t], a(n)) return !1;
if (r(n)) switch (arguments.length) {
case 1:
n.call(this);
break;
case 2:
n.call(this, arguments[1]);
break;
case 3:
n.call(this, arguments[1], arguments[2]);
break;
default:
for (i = arguments.length, o = new Array(i - 1), l = 1; i > l; l++) o[l - 1] = arguments[l];
n.apply(this, o)
} else if (s(n)) {
for (i = arguments.length, o = new Array(i - 1), l = 1; i > l; l++) o[l - 1] = arguments[l];
for (c = n.slice(), i = c.length, l = 0; i > l; l++) c[l].apply(this, o)
}
return !0
}, n.prototype.addListener = function(t, e) {
var i;
if (!r(e)) throw TypeError("listener must be a function");
if (this._events || (this._events = {}), this._events.newListener && this.emit("newListener", t, r(e.listener) ? e.listener : e), this._events[t] ? s(this._events[t]) ? this._events[t].push(e) : this._events[t] = [this._events[t], e] : this._events[t] = e, s(this._events[t]) && !this._events[t].warned) {
var i;
i = a(this._maxListeners) ? n.defaultMaxListeners : this._maxListeners, i && i > 0 && this._events[t].length > i && (this._events[t].warned = !0, console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[t].length), "function" == typeof console.trace && console.trace())
}
return this
}, n.prototype.on = n.prototype.addListener, n.prototype.once = function(t, e) {
function n() {
this.removeListener(t, n), i || (i = !0, e.apply(this, arguments))
}
if (!r(e)) throw TypeError("listener must be a function");
var i = !1;
return n.listener = e, this.on(t, n), this
}, n.prototype.removeListener = function(t, e) {
var n, i, a, o;
if (!r(e)) throw TypeError("listener must be a function");
if (!this._events || !this._events[t]) return this;
if (n = this._events[t], a = n.length, i = -1, n === e || r(n.listener) && n.listener === e) delete this._events[t], this._events.removeListener && this.emit("removeListener", t, e);
else if (s(n)) {
for (o = a; o-- > 0;)
if (n[o] === e || n[o].listener && n[o].listener === e) {
i = o;
break
}
if (0 > i) return this;
1 === n.length ? (n.length = 0, delete this._events[t]) : n.splice(i, 1), this._events.removeListener && this.emit("removeListener", t, e)
}
return this
}, n.prototype.removeAllListeners = function(t) {
var e, n;
if (!this._events) return this;
if (!this._events.removeListener) return 0 === arguments.length ? this._events = {} : this._events[t] && delete this._events[t], this;
if (0 === arguments.length) {
for (e in this._events) "removeListener" !== e && this.removeAllListeners(e);
return this.removeAllListeners("removeListener"), this._events = {}, this
}
if (n = this._events[t], r(n)) this.removeListener(t, n);
else
for (; n.length;) this.removeListener(t, n[n.length - 1]);
return delete this._events[t], this
}, n.prototype.listeners = function(t) {
var e;
return e = this._events && this._events[t] ? r(this._events[t]) ? [this._events[t]] : this._events[t].slice() : []
}, n.listenerCount = function(t, e) {
var n;
return n = t._events && t._events[e] ? r(t._events[e]) ? 1 : t._events[e].length : 0
}
}, {}],
3: [function(t, e) {
"use strict";
var n = window.d3;
e.exports = {
COLORS: ["steelblue", "red", "#05b378", "orange", "#4040e8", "yellow"].map(function(t) {
return n.hsl(t)
}),
ITERATIONS_LIMIT: 1e3,
DEFAULT_WIDTH: 550,
DEFAULT_HEIGHT: 350,
TIP_X_EPS: 1
}
}, {}],
4: [function(t, e) {
"use strict";
var n = t("./utils"),
r = t("./constants"),
i = n.assert;
e.exports = {
range: function(t, e) {
var n = e.range || [-1 / 0, 1 / 0],
r = t.meta.xScale,
i = Math.max(r.domain()[0], n[0]),
s = Math.min(r.domain()[1], n[1]);
return [i, s]
},
eval: function(t, e) {
i("function" == typeof e.fn);
var s = [],
a = this.range(t, e),
o = a[0],
l = a[1],
c = e.samples || 100,
u = e.deltaX;
u || (u = (l - o) / c);
var h = (l - o) / u;
h = h || 1, i(h >= 0), h > r.ITERATIONS_LIMIT && (h = r.ITERATIONS_LIMIT, u = (l - o) / h);
for (var p = 0; h >= p; p += 1) {
var f = o + u * p,
d = e.fn(f);
n.isValidNumber(f) && n.isValidNumber(d) && s.push([f, d])
}
return s = this.split(s, e.graphOptions)
},
split: function(t, e) {
e = e || {};
var n = .001,
r = Array.prototype.slice.call(e.limits || []),
i = [],
s = 0,
a = 1,
o = [];
for (r.unshift(-1e8), r.push(1e8); s < t.length;) {
for (; s < t.length && t[s][0] < r[a - 1] + n;) ++s;
for (o = []; s < t.length && t[s][0] >= r[a - 1] + n && t[s][0] <= r[a] - n;) o.push(t[s++]);
++a, o.length && i.push(o)
}
return i
}
}
}, {
"./constants": 3,
"./utils": 11
}],
5: [function(t, e) {
"use strict";
var n = window.d3,
r = t("../types/line");
e.exports = function(t) {
function e(t) {
var e = t.derivative.x0,
n = t.fn(e),
r = t.derivative.fn(e);
a.fn = function(t) {
return r * (t - e) + n
}
}
function i(e) {
var n = this;
e.derivative.updateOnMouseOver && !e.derivative.$$mouseListener && (e.derivative.$$mouseListener = function(t) {
e.derivative.x0 = t, s(n)
}, t.owner.on("tip:update", e.derivative.$$mouseListener))
}
var s, a = {
skipTip: !0
};
return s = function(s) {
s.each(function(o) {
var l = n.select(this);
e.call(s, o), i.call(s, o);
var c = l.selectAll("g.derivative").data([a]);
c.enter().append("g").attr("class", "derivative"), c.call(r(t)), c.selectAll("path").attr("opacity", .5)
})
}
}
}, {
"../types/line": 9
}],
6: [function(t, e) {
"use strict";
var n = window.d3,
r = t("./derivative");
e.exports = function(t) {
function e(e) {
e.each(function(e) {
var i = n.select(this);
e.derivative && i.call(r(t))
})
}
return e
}
}, {
"./derivative": 5
}],
7: [function(t, e) {
"use strict";
var n = window.d3,
r = t("extend"),
i = t("./utils"),
s = t("./constants");
e.exports = function(t) {
function e(t, e) {
return t.append("path").datum(e).attr("stroke", "grey").attr("stroke-dasharray", "5,5").attr("opacity", .5).attr("d", l)
}
function a(r) {
var i = r.selectAll("g.tip").data(function(t) {
return [t]
});
i.enter().append("g").attr("class", "tip").attr("clip-path", "url(#function-plot-clip-" + t.owner.id + ")"), a.el = i.selectAll("g.inner-tip").data(function(t) {
return [t]
}), a.el.enter().append("g").attr("class", "inner-tip").style("display", "none").each(function() {
var r = n.select(this);
e(r, [
[0, -t.owner.meta.height - o],
[0, t.owner.meta.height + o]
]).attr("class", "tip-x-line").style("display", "none"), e(r, [
[-t.owner.meta.width - o, 0],
[t.owner.meta.width + o, 0]
]).attr("class", "tip-y-line").style("display", "none"), r.append("circle").attr("r", 3), r.append("text").attr("transform", "translate(5,-5)")
}), r.selectAll(".tip-x-line").style("display", t.xLine ? null : "none"), r.selectAll(".tip-y-line").style("display", t.yLine ? null : "none")
}
t = r({
xLine: !1,
yLine: !1,
renderer: function(t, e) {
return "(" + t.toFixed(3) + ", " + e.toFixed(3) + ")"
},
owner: null
}, t);
var o = 20,
l = n.svg.line().x(function(t) {
return t[0]
}).y(function(t) {
return t[1]
});
return a.move = function(e, n) {
var r, l, c, u = 1 / 0,
h = -1,
p = a.el,
f = 1e8,
d = t.owner.meta,
v = p.data()[0].data,
m = d.xScale,
y = d.yScale,
x = d.width,
g = d.height;
for (r = 0; r < v.length; r += 1)
if (!v[r].skipTip) {
var b = v[r].range || [-f, f];
if (e > b[0] - s.TIP_X_EPS && e < b[1] + s.TIP_X_EPS) {
var w = v[r].fn(e);
if (i.isValidNumber(w)) {
var _ = Math.abs(w - n);
u > _ && (u = _, h = r)
}
}
}
if (-1 !== h) {
l = e, v[h].range && (l = Math.max(l, v[h].range[0]), l = Math.min(l, v[h].range[1])), c = v[h].fn(l), a.show(), t.owner.emit("tip:update", l, c, h);
var L = i.restrict(l, m.invert(-o), m.invert(x + o)),
A = i.restrict(c, y.invert(g + o), y.invert(-o));
p.attr("transform", "translate(" + m(L) + "," + y(A) + ")"), p.select("circle").attr("fill", s.COLORS[h]), p.select("text").attr("fill", s.COLORS[h]).text(t.renderer(l, c))
} else a.hide()
}, a.show = function() {
this.el.style("display", null)
}, a.hide = function() {
this.el.style("display", "none")
}, Object.keys(t).forEach(function(e) {
i.getterSetter.call(a, t, e)
}), a
}
}, {
"./constants": 3,
"./utils": 11,
extend: 12
}],
8: [function(t, e) {
"use strict";
e.exports = {
line: t("./line"),
scatter: t("./scatter")
}
}, {
"./line": 9,
"./scatter": 10
}],
9: [function(t, e) {
"use strict";
var n = window.d3,
r = t("../constants"),
i = t("../data");
e.exports = function(t) {
function e(s) {
var a = t.index;
s.each(function(s) {
var c = e.el = n.select(this),
u = i.eval(t.owner, s),
h = c.selectAll("path").data(u);
h.enter().append("path").attr("class", "line line-" + a).attr("stroke", r.COLORS[a]), h.each(function() {
var e, i = n.select(this);
t.closed ? (i.attr("fill", r.COLORS[a]), i.attr("fill-opacity", .3), e = l) : (i.attr("fill", "none"), e = o), i.attr("d", e)
}), h.exit().remove()
})
}
var s = t.owner.meta.xScale,
a = t.owner.meta.yScale,
o = n.svg.line().interpolate(t.interpolate || "cardinal").x(function(t) {
return s(t[0])
}).y(function(t) {
return a(t[1])
}),
l = n.svg.area().x(function(t) {
return s(t[0])
}).y0(a(0)).y1(function(t) {
return a(t[1])
});
return e
}
}, {
"../constants": 3,
"../data": 4
}],
10: [function(t, e) {
"use strict";
var n = window.d3,
r = t("../constants"),
i = t("../data");
e.exports = function(t) {
function e(e) {
var o = t.index;
e.each(function(e) {
var l, c, u = n.hsl(r.COLORS[o].toString()),
h = i.eval(t.owner, e),
p = [];
for (l = 0; l < h.length; l += 1)
for (c = 0; c < h[l].length; c += 1) p.push(h[l][c]);
var f = n.select(this).selectAll("circle").data(p);
f.enter().append("circle").attr("class", "circle circle-" + o).attr("fill", n.hsl(u.toString()).brighter(1.5)).attr("stroke", u), f.attr("opacity", .7).attr("r", 1).attr("cx", function(t) {
return s(t[0])
}).attr("cy", function(t) {
return a(t[1])
}), f.exit().remove()
})
}
var s = t.owner.meta.xScale,
a = t.owner.meta.yScale;
return e
}
}, {
"../constants": 3,
"../data": 4
}],
11: [function(t, e) {
"use strict";
e.exports = {
isValidNumber: function(t) {
return "number" == typeof t && !isNaN(t) && isFinite(t)
},
getterSetter: function(t, e) {
var n = this;
this[e] = function(r) {
return arguments.length ? (t[e] = r, n) : t[e]
}
},
restrict: function(t, e, n) {
if (e > n) {
var r = e;
e = n, n = r
}
return t = Math.max(t, e), t = Math.min(t, n)
},
assert: function(t, e) {
if (e = e || "assertion failed", !t) throw new Error(e)
}
}
}, {}],
12: [function(t, e) {
var n, r = Object.prototype.hasOwnProperty,
i = Object.prototype.toString,
s = function(t) {
"use strict";
if (!t || "[object Object]" !== i.call(t)) return !1;
var e = r.call(t, "constructor"),
s = t.constructor && t.constructor.prototype && r.call(t.constructor.prototype, "isPrototypeOf");
if (t.constructor && !e && !s) return !1;
var a;
for (a in t);
return a === n || r.call(t, a)
};
e.exports = function a() {
"use strict";
var t, e, r, i, o, l, c = arguments[0],
u = 1,
h = arguments.length,
p = !1;
for ("boolean" == typeof c ? (p = c, c = arguments[1] || {}, u = 2) : ("object" != typeof c && "function" != typeof c || null == c) && (c = {}); h > u; ++u)
if (t = arguments[u], null != t)
for (e in t) r = c[e], i = t[e], c !== i && (p && i && (s(i) || (o = Array.isArray(i))) ? (o ? (o = !1, l = r && Array.isArray(r) ? r : []) : l = r && s(r) ? r : {}, c[e] = a(p, l, i)) : i !== n && (c[e] = i));
return c
}
}, {}]
}, {}, [1])(1)
});