【发布时间】:2017-08-21 15:09:11
【问题描述】:
当使用 Chart JS 将鼠标悬停在数据点上时,我无法弄清楚如何在折线图上绘制垂直线。我希望这条线保持在图表矩形的范围内,这样它就不会延伸到刻度区域。任何帮助将不胜感激!
【问题讨论】:
标签: javascript chart.js chartjs-2.6.0
当使用 Chart JS 将鼠标悬停在数据点上时,我无法弄清楚如何在折线图上绘制垂直线。我希望这条线保持在图表矩形的范围内,这样它就不会延伸到刻度区域。任何帮助将不胜感激!
【问题讨论】:
标签: javascript chart.js chartjs-2.6.0
目前还没有本机功能,您必须创建一个图表插件来完成此操作。
ᴘʟᴜɢɪɴ (ᴅʀᴀᴡ ᴠᴇʀᴛɪᴄᴀʟ ʟɪɴᴇ ᴏɴ ᴍᴏᴜꜱᴇᴏᴠᴇʀ ᴀᴛ ᴅᴀᴛᴀ-ᴛᴏ)
Chart.plugins.register({
afterDatasetsDraw: function(chart) {
if (chart.tooltip._active && chart.tooltip._active.length) {
var activePoint = chart.tooltip._active[0],
ctx = chart.ctx,
y_axis = chart.scales['y-axis-0'],
x = activePoint.tooltipPosition().x,
topY = y_axis.top,
bottomY = y_axis.bottom;
// draw line
ctx.save();
ctx.beginPath();
ctx.moveTo(x, topY);
ctx.lineTo(x, bottomY);
ctx.lineWidth = 2;
ctx.strokeStyle = '#07C';
ctx.stroke();
ctx.restore();
}
}
});
* 在脚本开头添加此插件
ᴅᴇᴍᴏ ⧩
Chart.plugins.register({
afterDatasetsDraw: function(chart) {
if (chart.tooltip._active && chart.tooltip._active.length) {
var activePoint = chart.tooltip._active[0],
ctx = chart.ctx,
y_axis = chart.scales['y-axis-0'],
x = activePoint.tooltipPosition().x,
topY = y_axis.top,
bottomY = y_axis.bottom;
// draw line
ctx.save();
ctx.beginPath();
ctx.moveTo(x, topY);
ctx.lineTo(x, bottomY);
ctx.lineWidth = 2;
ctx.strokeStyle = '#07C';
ctx.stroke();
ctx.restore();
}
}
});
var chart = new Chart(ctx, {
type: 'line',
data: {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
datasets: [{
label: 'LINE',
data: [3, 1, 4, 2, 5],
backgroundColor: 'rgba(0, 119, 290, 0.2)',
borderColor: 'rgba(0, 119, 290, 0.6)',
fill: false
}]
},
options: {
responsive: false,
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
<canvas id="ctx" height="200"></canvas>
【讨论】:
ctx.beginPath(); 之后添加了ctx.setLineDash([3, 3]);。
即使有一个公认的答案,我想我可能会贡献一个我写的插件来专门解决这个问题。
chartjs 线高标注插件
https://www.npmjs.com/package/chartjs-plugin-lineheight-annotation
如果需要,有一些可导出的类可以帮助您计算到数据点的顶部。此外,还有一个简单的 API,您可以将其添加到图表的选项对象中
/// default values
lineHeightAnnotation: {
// defaults to have line to the highest data point on every tick
always: true,
// optionally, only have line draw to the highest datapoint nearest the user's hover position
hover: false,
// colors of the line
color: '#000',
// name of yAxis
yAxis: 'y-axis-0',
// weight of the line
lineWeight: 1.5,
/// sets shadow for ALL lines on the canvas
shadow: {
// color of the shadow
color: 'rgba(0,0,0,0.35)',
// blur of the shadow
blur: 10,
/// shadow offset
offset: {
// x offset
x: 0,
// y offset
y: 3
}
},
// dash defaults at [10, 10]
noDash: true,
}
【讨论】: