如何绘制绘制数学函数的自动缩放 D3.js 图形?

How can I draw an autoscaling D3.js graph that plots a mathematical function?

我有 a working jsfiddle 是我使用 JSXGraph 制作的,JSXGraph 是一个用于数学函数的图形工具包。我想将其移植到 D3.js 以供个人启迪,但我很难开始。

jsfiddle 绘制了 -ke(-x/T) + k 的值,其中 x 是自变量,kt 的值来自滑块。

board.create('functiongraph',
  [
    // y = -k * e(-x/t) + k
    function(x) { return -k.Value()*Math.exp(-x/t.Value()) + k.Value(); },
    0
  ]
);

我最难过的三件事:

我解决这个问题的正确方法是什么?

threw this example together really quick, so don't ding me on the code quality. But it should give you a good starting point for how you'd do something like this in d3. I implemented everything in straight d3, even the 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))
}