Javascript Canvas 问题:为什么我在 canvas 上的点与图表的高度不正确对应?

Javascript Canvas issue: Why do my points on the canvas not correspond properly to the height of the graph?

我正在尝试使用看起来像典型折线图的 canvas 制作折线图,并使用我们在代数中学到的典型笛卡尔坐标; 左下角0,0开始,x轴位置由要绘制的项目数决定。

然而,点的位置与输入不匹配(虽然图形的形状是正确的,表明我做对了)。我做错了什么?

我已经重写并调整了无数次转换公式

function newLineGraph(parent, width, height, dataArray) {
    //this makes the element using my own code, no observable error here
    var canvas = newCanvas(parent, width, height);
    var canvasContext = canvas.getContext("2d");

    var spaceBetweenEntries = width / dataArray.length;

    var largestNumber = findHighestNumber(dataArray);

    canvasContext.beginPath();
    canvasContext.moveTo(0, 0);

    var n = 0;
    while (dataArray[n]) {

        var x = spaceBetweenEntries * n;
        var y = height - dataArray[n];
        console.log("x,y", x, y);
        canvasContext.lineTo(x, y);
        n++;
    }
    canvasContext.stroke();

    return canvas;
}

编辑:修复了图像,以便您可以看到 canvas 大小

生成的图比预期的图小得多;例如 newLineGraph("body",55,45,[1,40,10]); 生成一个角落有一个小 ^ 形状的图形,而不是从底部开始。但是,控制台日志显示 " 0 44" "18.333333333333332 5","36.666666666666664 35",我认为应该会生成一个非常适合整个图表的图表。

第一个 lineTox 始终为 0,所以我假设第一行没有按照您的预期绘制。它更像是 |/\ 形状而不是 \/\。 像这样设置 x:

var x = spaceBetweenEntries * (n + 1);

编辑

正如您在此 fiddle 中看到的那样,您的图表会根据您发布的坐标在正确的点呈现。我按照预期的方式实现了 newCanvas 函数。那么我们是否遗漏了一些其他修改 canvas widthheight 的代码?

function newCanvas(parent, width, height) {
  const canvas = document.createElement('canvas');
  canvas.width = width;
  canvas.height = height;
  document.querySelector(parent).appendChild(canvas);
  return canvas;
}

问题是使用 style.width 和 style.height 修改 canvas 高度,而不是 canvas.height 和 canvas.width