我使用JSXGraph制作了a working jsfiddle,这是一个用于数学函数的图形工具包。我想将它移植到D3.js进行个人启发,但我很难开始。
jsfiddle绘制-ke(-x/T) + k
的值,其中x是一个自变量,k
和t
的值来自滑块。
board.create('functiongraph',
[
// y = -k * e(-x/t) + k
function(x) { return -k.Value()*Math.exp(-x/t.Value()) + k.Value(); },
0
]
);
我最难以理解的三件事:
实际上绘制图形及其轴 - 我不清楚D3 API的许多部分应该使用哪个部分,或者我应该在什么级别的抽象操作。
更改滑块时重新渲染图形,并使图形识别滑块的值。
缩小图形,使y = k定义的渐近线始终可见,而不是在图形的前15%范围内。我现在这样做:
function getAestheticBoundingBox() {
var kMag = k.Value();
var tMag = t.Value();
var safeMinimum = 10;
var limit = Math.max(safeMinimum, 1.15 * Math.max(k.Value(), t.Value()));
return [0, Math.ceil(limit), Math.ceil(limit), 0];
}
解决这个问题的正确方法是什么?
答案 0 :(得分:1)
我threw this example together really quick,所以请不要告诉我代码质量。但它应该为你在d3
中如何做这样的事情提供一个很好的起点。我直接d3
实现了所有内容,甚至是sliders。
正如@LarKotthoff所说,关键是你必须循环你的功能并建立你的数据:
// define your function
var func = function(x) {
return -sliders.k() * Math.exp(-x / sliders.t()) + sliders.k();
},
// your step for looping function
step = 0.01;
drawPlot();
function drawPlot() {
// avoid first callback before both sliders are created
if (!sliders.k ||
!sliders.t) return;
// set your limits
var kMag = sliders.k();
var tMag = sliders.t();
var safeMinimum = 10;
var limit = Math.max(safeMinimum, 1.15 * Math.max(kMag, tMag));
// generate your data
var data = [];
for (var i = 0; i < limit; i += step) {
data.push({
x: i,
y: func(i)
})
}
// set our axis limits
y.domain(
[0, Math.ceil(limit)]
);
x.domain(
[0, Math.ceil(limit)]
);
// redraw axis
svg.selectAll("g.y.axis").call(yAxis);
svg.selectAll("g.x.axis").call(xAxis);
// redraw line
svg.select('.myLine')
.attr('d', lineFunc(data))
}