当前位置: 首页 > 知识库问答 >
问题:

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

尉迟清野
2023-03-14

我很难找到正确的设置,使ChartJS条形图具有固定的画布高度,但允许宽度为overflow-x。我在这里找到了一个示例。。。http://jsfiddle.net/mbhavfwm/它使用ChartJS1.0,但我使用的是ChartJS2.6。所以,我在这里找到了另一个例子http://jsfiddle.net/jmpxgufu/它使用ChartJS 2,但本例显示了仅使用少数值呈现的图表,然后使用javascript向其添加更多值,这会导致宽度溢出。不完全一样。

我的问题是,我不知道如何使图表在所有数据都已在其中的情况下以固定高度呈现,但不尝试将画布约束到父容器的宽度。我想让它溢出来。

这是我到目前为止所拥有的。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);
        }
      }
    }
  });
});

所以,我的目标是让图表达到由画布宽度定义的1200像素,但是对于容器div来说,只显示600像素,在那里我可以滚动容器以查看图表的其余部分,同时保持Y轴在地方。

谁能解释一下我做错了什么?我错过了什么?

谢谢!!!!!

共有1个答案

颛孙玉石
2023-03-14

这似乎与您在画布周围缺少一个包装器有关。这是你小提琴的更新版本。我添加了一个名为addData函数,它获取您想要添加的新条目的数量和图表变量。它并不尽如人意(因为我不是100%确定你想如何添加新数据),但这是一个很好的起点。诀窍是不要初始化包含所有数据图表,您要创建图表,然后添加到它以扩展画布,否则初始渲染将适合所有的数据在该宽度

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);

但是请记住,无论您想添加多少数据和图表实例,这都需要很多数据。

以及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>

我猜问题是,因为您使用的单个包装的宽度随着图表而变化,这意味着没有应用水平滚动,这样外部包装的宽度固定,而内部包装和画布可以展开。

 类似资料:
  • 问题内容: 我有这个HTML结构: 我想在主体部分(#body)中包含三个部分而不会溢出。因此,我需要在中间部分使用滚动条。 我尝试了这个CSS: 和这个: 但是它们都不起作用。 我在JSFiddle上做了一个例子。 我可以仅使用CSS和HTML来做到这一点吗?我宁愿避免使用Javascript。 问题答案: Flexbox是一种现代替代方案,可让您无需固定高度或JavaScript即可执行此操作

  • 已解决的检查答案如下... 因此,我正在尝试为我的Android应用程序创建一个评论功能,我想在recyclerview中显示评论,然后在recyclerview下面有一个按钮和textview来添加评论。我想让recyclerview有一定的高度,如果有很多评论,它就可以滚动,因为我不想让用户不得不向下滚动屏幕才能找到add按钮。 我不能让它工作,所以我想知道是否有人有这个问题。 我的XML(滚

  • 我正在使用chartjs版本:2.1.4在MVC应用程序中创建图表。我正在使用控制条形图的宽度,以进行固定宽度设置。它在只有条形图的情况下工作正常,但在“堆叠条形图”的情况下,我无法确定条形图的宽度。我正在使用以下代码创建堆叠条形图,如下所示: 在这种情况下,"barper"属性不起作用。请在"chartjs版本: 2.1.4"中建议我解决方案。 提前谢谢

  • 我正在尝试使用MPAndroidChart在我的应用程序中创建图表。 但有一些具体的特点。 > 图形将比屏幕宽度宽,因此它必须具有最小宽度并可滚动(对于我正在使用的宽度,但它不可滚动):

  • 问题内容: 有人可以告诉我如何修改此使用matplotlib的Python代码,以便无论绘制多少分,条的宽度都将保持恒定吗?先感谢您! 问题答案: 条的宽度相同!它们看起来不一样的原因是因为您正在使用以下行: 这将更改您的x值,从而更改x轴的比例。为了抵消这种影响,您可以更改x轴的限制,也可以使条形宽度取决于分数的数量,例如,如果0.35的宽度适用于10个分数,那么如果将分数的数量加倍,条宽度的一

  • 我正在纠结于应用程序的布局。我只想用HTML&CSS来实现它,但绝望正在逼近。我需要: 固定高度、100%宽度、静态标题 固定高度、100%宽度、静态页脚 固定宽度的内容区域,居中和全部剩余高度 内容区域需要: 两列,均为全高 上面的内容相当简单,但可能需要更改以适应下一部分。 每一列都需要: 静态标头 静态页脚 页眉和页脚之间的可滚动内容区域 我花了一天的时间尝试各种方法(甚至是基于--喘息--