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

时间:2015-04-20 18:17:03

标签: d3.js

我使用JSXGraph制作了a working jsfiddle,这是一个用于数学函数的图形工具包。我想将它移植到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
  ]
);

我最难以理解的三件事:

  • 实际上绘制图形及其轴 - 我不清楚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];
    }
    

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

1 个答案:

答案 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))
}