Как отобразить вертикальную линию при наведении в chartjs
Я пытаюсь отобразить вертикальную линию при наведении курсора на область графика в chartjs v2. У меня есть базовая рабочая версия, но я не понял, как удалить линию каждый раз, когда линия рисуется (старые линии просто остаются).
вот рабочий пример -https://jsfiddle.net/s9gyynxp/5/
var ctx = document.getElementById("myChart");
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3]
}]
}
});
// Hook into main event handler
var parentEventHandler = Chart.Controller.prototype.eventHandler;
Chart.Controller.prototype.eventHandler = function() {
var ret = parentEventHandler.apply(this, arguments);
// Draw the vertical line here
var eventPosition = Chart.helpers.getRelativePosition(arguments[0], this.chart);
this.chart.ctx.beginPath();
this.chart.ctx.moveTo(eventPosition.x, 30);
this.chart.ctx.strokeStyle = "#ff0000";
this.chart.ctx.lineTo(eventPosition.x, 340);
this.chart.ctx.stroke();
return ret;
};
примечание Я видел другие решения этого, где второй слой холста используется поверх холста диаграммы - я не думаю, что это опция для меня, поскольку мне нужна вертикальная линия, чтобы появиться поверх диаграммы, но ниже пользовательской подсказки я буду реализовывать.
любые предложения приветствуются, спасибо!
2 ответов
просто добавьте следующие строки, прежде чем рисовать свою линию
...
this.clear();
this.draw();
...
кстати, ваша линия не тянется до самого дна. Если вы хотите, чтобы он растягивался полностью, используйте 0
и this.chart.height
для вашего yStart и yEnd. Или вы можете использовать шкалу оси y для вычисления максимальных и минимальных пикселей для шкалы (см. https://jsfiddle.net/ombaww9t/).
Скрипка -https://jsfiddle.net/56s9av1j/
рабочая версия для 2.6.0 (измените 'y-axis-0' на id вашей оси y)
// Hook into main event handler
let parentEventHandler = Chart.Controller.prototype.eventHandler;
Chart.Controller.prototype.eventHandler = function () {
let ret = parentEventHandler.apply(this, arguments);
let x = arguments[0].x;
let y = arguments[0].y;
this.clear();
this.draw();
let yScale = this.scales['y-axis-0'];
this.chart.ctx.beginPath();
this.chart.ctx.moveTo(x, yScale.getPixelForValue(yScale.max));
this.chart.ctx.strokeStyle = "#ff0000";
this.chart.ctx.lineTo(x, yScale.getPixelForValue(yScale.min));
this.chart.ctx.stroke();
return ret;
};