Chartjs在调整大小时更改值

时间:2018-11-02 15:08:28

标签: javascript plugins resize chart.js

我正在使用chartjs在页面上生成图表。如果我调整画布的大小,则图表会更改图形上的值。仅当我使用自定义插件时,它才会发生。

plugins: [horizonalLinePlugin]

如果我删除自定义插件,则效果很好。我也不确定应该使用哪个钩子。最好将我尝试渲染的新行置于网格线的后面。

为什么会这样? 这是我的代码:

function median(values) {
  values.sort(function(a, b) {
    return a - b;
  });

  if (values.length === 0) return 0

  var half = Math.floor(values.length / 2);

  if (values.length % 2)
    return values[half];
  else
    return (values[half - 1] + values[half]) / 2.0;
}

var horizonalLinePlugin = {
  beforeDraw: function(chartInstance) {
    var yValue;
    var yMinValue;
    var yMaxValue;
    var yScale = chartInstance.scales["y-axis-0"];
    var canvas = chartInstance.chart;
    var ctx = canvas.ctx;
    var index;
    var line;
    var style;

    if (chartInstance.data.datasets[0].data) {
      yValue = median(chartInstance.data.datasets[0].data);
      yMinValue = chartInstance.options.scales.yAxes[0].ticks.min;
      yMaxValue = chartInstance.options.scales.yAxes[0].ticks.max;
      ctx.lineWidth = 3;

      if (yValue) {
        ctx.beginPath();
        ctx.moveTo(26, ((canvas.height - 25) * ((yMaxValue - yValue) / (yMaxValue - yMinValue))));
        ctx.lineTo(canvas.width - 15, ((canvas.height - 25) * ((yMaxValue - yValue) / (yMaxValue - yMinValue))));
        ctx.strokeStyle = '#f4f4f4';
        ctx.fillStyle = '#f4f4f4';
        ctx.stroke();
      }

      return;
    }
  }
};
//Chart.pluginService.register(horizonalLinePlugin);

var randomScalingFactor = function() {
  return Math.ceil(Math.random() * 10.0 + Math.random() * 60.0);
};

var config = {
  plugins: [horizonalLinePlugin],
  type: 'line',
  data: {
    labels: ['12.6.', '13.6.', '14.6.', '15.6.', '16.6.', '17.6.', '18.6.', '19.6.', '20.6.'],
    datasets: [{
      label: '',
      backgroundColor: '#2198e8',
      borderColor: '#2198e8',
      borderWidth: 3,
      fill: false,
      pointRadius: 2,
      data: [
        randomScalingFactor(),
        randomScalingFactor(),
        randomScalingFactor(),
        randomScalingFactor(),
        randomScalingFactor(),
        randomScalingFactor(),
        randomScalingFactor(),
        randomScalingFactor(),
        randomScalingFactor()
      ],
    }]
  },
  options: {
    responsive: true,
    legend: {
      display: false
    },
    title: {
      display: false,
      text: ''
    },
    tooltips: {
      mode: 'index',
      intersect: false,
    },
    hover: {
      mode: 'nearest',
      intersect: true
    },
    scales: {
      yAxes: [{
        gridLines: {
          drawBorder: false,
          color: ['#f4f4f4'],
          lineWidth: [1]
        },
        ticks: {
          min: 0,
          max: 100,
          stepSize: 10
        }
      }]
    }
  }
};

window.onload = function() {
  var ctx = document.getElementById('statistics-graph').getContext('2d');
  window.myLine = new Chart(ctx, config);
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.bundle.js"></script>
<div class="graph-element">
  <canvas id="statistics-graph"></canvas>
</div>

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题出在您的中位数函数中。您正在对数组进行排序,因此图表对此做出了反应。一个简单的事情就是切成一个新的数组。我将参数重命名为inValues,并设置了原始值= inValues.slice()

function median(inValues) {
  const values = inValues.slice();

  values.sort(function(a, b) {
    return a - b;
  });

  if (values.length === 0) return 0

  var half = Math.floor(values.length / 2);

  if (values.length % 2)
    return values[half];
  else
    return (values[half - 1] + values[half]) / 2.0;
}