ChartJS 2.6 - 条形图固定高度可滚动-X

ChartJS 2.6 - Bar chart fixed height scrollable-X

我在尝试找出具有固定 canvas 高度但允许宽度为 overflow-x 的 ChartJS 条形图的正确设置时遇到了问题。我在这里找到了一个示例...http://jsfiddle.net/mbhavfwm/ which uses ChartJS 1.0, but I'm using ChartJS 2.6. So, I found another example here http://jsfiddle.net/jmpxgufu/,它使用 ChartJS 2,但此示例显示仅使用几个值呈现的图表,然后使用 javascript 添加更多值,然后导致宽度溢出.不太一样。

我的问题是我无法弄清楚如何使图表以固定高度呈现并包含所有数据,但不要尝试将 canvas 限制为父容器的宽度。我想让它溢出来。

这是我目前所掌握的。 https://jsfiddle.net/fed79b7t/

HTML

<div class="chartWrapper">
  <div class="chartAreaWrapper">
    <canvas id="chart-FuelSpend" height="300" width="1200"></canvas>
  </div>
  <canvas id="axis-FuelSpend" height="300" width="0"></canvas>
</div>

CSS

.chartWrapper {
  position: relative;
}

.chartWrapper > canvas {
  position: absolute;
  left: 0;
  top: 0;
  pointer-events: none;
}

.chartAreaWrapper {
  width: 600px;
  overflow-x: scroll;
}

JAVASCRIPT

function generateLabels() {
  var chartLabels = [];
  for (x = 0; x < 100; x++) {
    chartLabels.push("Label" + x);
  }
  return chartLabels;
}

function generateData() {
  var chartData = [];
  for (x = 0; x < 100; x++) {
    chartData.push(Math.floor((Math.random() * 100) + 1));
  }
  return chartData;
}

var chartData = {
  labels: generateLabels(),
  datasets: [{
    label: "Test Data Set",
    data: generateData()
  }]
};

$(function() {
  var canvasFuelSpend = $('#chart-FuelSpend');
  var chartFuelSpend = new Chart(canvasFuelSpend, {
    type: 'bar',
    data: chartData,
    maintainAspectRatio: false,
    responsive: true,
    options: {
      tooltips: {
        titleFontSize: 0,
        titleMarginBottom: 0,
        bodyFontSize: 12
      },
      legend: {
        display: false
      },
      scales: {
        xAxes: [{
          ticks: {
            fontSize: 12,
            display: false
          }
        }],
        yAxes: [{
          ticks: {
            fontSize: 12,
            beginAtZero: true
          }
        }]
      },
      animation: {
        onComplete: function() {
          var sourceCanvas = chartFuelSpend.chart.canvas;
          var copyWidth = chartFuelSpend.scales['y-axis-0'].width - 10;
          var copyHeight = chartFuelSpend.scales['y-axis-0'].height + chartFuelSpend.scales['y-axis-0'].top + 10;
          var targetCtx = document.getElementById("axis-FuelSpend").getContext("2d");
          targetCtx.canvas.width = copyWidth;
          targetCtx.drawImage(sourceCanvas, 0, 0, copyWidth, copyHeight, 0, 0, copyWidth, copyHeight);
        }
      }
    }
  });
});

所以,我的目标是让图表达到由 canvas 宽度定义的完整 1200 像素,但容器 div 只显示 600 像素,我可以在其中滚动容器以在保持 Y 轴就位的同时查看图表的其余部分。

任何人都可以阐明我做错了什么吗?我错过了什么?

谢谢!!!!!

这似乎与您缺少 canvas 周围的包装器这一事实有关。这是您的 fiddle 的更新版本。我添加了一个名为 addDatafunction,它包含您要添加的新条目数和 chart 变量。它不是最好的(因为我不是 100% 确定你想如何添加新数据)但它是一个很好的起点。诀窍是不初始化包含所有 datachart,您想要创建 chart 然后添加到它以扩展 canvas,否则初始渲染将工作以适应 width.

中的所有 data

https://jsfiddle.net/qmqmg82z/3/

附加JavaScript代码:

function addData(numData, chart){
    for (var i = 0; i < numData; i++){
        chart.data.datasets[0].data.push(Math.random() * 100);
        chart.data.labels.push("Label" + i);
        var newwidth = $('.chartAreaWrapper2').width() +60;
        $('.chartAreaWrapper2').width(newwidth);
    }
}

然后在页面加载函数的末尾(或任何您想添加新数据的地方)添加此函数调用:

addData(5, chartFuelSpend);

但请记住,无论您要添加多少数据和 chart 实例,这都需要。

和 HTML:

<div class="chartWrapper">
  <div class="chartAreaWrapper">
      <div class="chartAreaWrapper2">
          <canvas id="chart-FuelSpend" height="300" width="1200"></canvas>
      </div>
  </div>
  <canvas id="axis-FuelSpend" height="300" width="0"></canvas>
</div>

我猜问题是因为您拥有的单个包装器的 widthchart 一起发生变化,这意味着没有应用水平滚动,这外包装有固定的 width 而内包装和 canvas 可以扩展的方式。