我正在使用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>
感谢您的帮助。
答案 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;
}