Charts.js有(2015年年中新实现的)自定义函数,在工具提示正常出现时触发,允许用户创建自定义行为。
对于具有多个数据集的折线图,如何访问工具提示数据、解析它并操作高亮显示的数据点的数值?
例如,可以触发一个警报而不是工具提示:
Chart.defaults.global.customTooltips = function (tooltip) {
alert('Hello');
}
但是如何获取工具提示中显示的数据、解析它并使用它呢?
我张贴了一个答案,演示抓取所有工具提示数据,但是如果用户悬停在单个数据点上,我们如何获得悬停点的数据?或者,是否有可能点击单个数据点并只获得该数据,这样我们就知道哪个数据点被点击了?
我将接受正确的答案,显示如何获得单个(悬停或单击)数据点。
如何定义自定义工具提示函数:
Chart.defaults.global.customTooltips = function (tooltip) {}
在工具提示触发时触发。(注意,工具提示不会标识悬停在单个数据点上。相反,它们返回整个垂直序列。)
tooltips
对象包含每个悬停(垂直)系列的这些属性:
- title: x轴标签(垂直)"3"
- 标签:所有数据点(垂直),例如[29,86]
此外,可以像这样访问悬停序列的数据集:
- 数据集[0]:第一个序列(水平),例如[65,59,80,81,56,55,40]
- data.datasets[1]。标签:第二个水平数据系列的标签
下面是移动鼠标时提取数据的示例:
jsFiddle演示
HTML:<div class="panel panel-success">
<div id="rpt"></div>
<div class="panel-heading">
<div id="i">
Change purple series:
<input id="ii" type="text" value="99"/>
<button id="ib">Update</button>
</div>
<h3 class="panel-title">Panel Title</h3>
</div>
<div class="panel-body">
<canvas id="myChart" width="600" height="400"></canvas>
</div>
</div>
javascript/jQuery: //Update 2nd datapoint, purple series
$('#ib').click(function(){
tmp = $('#ii').val();
myLineChart.datasets[0].points[2].value = tmp;
myLineChart.update();
$('#ii').val( ~~(Math.random() * 80) + 20 ); //gen new number
});
//Custom Tooltip Function - try uncommenting various alerts
Chart.defaults.global.customTooltips = function (tooltip) {
if (tooltip.y){
tt = tooltip.title;
ll = tooltip.labels;
no = tooltip.labels.length;
rpt = 'Title: ' +tt+ ' - Data: ';
for (i=0;i<no;i++){
// alert( data.datasets[i].strokeColor );
// alert( data.datasets.length );
// alert( data.datasets[i].label );
// alert( tooltip.labels[i] );
rpt += data.datasets[i].label +': '+ ll[i] +'; ';
}
alert(rpt);
//alert('Title: ' +tt+ ' - Data: ' +ll );
//alert( JSON.stringify(tooltip) );
//$('#rpt').html( JSON.stringify(tooltip) );
}
}
//Chart data
var data = {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [{
label: "Purple Cows",
fillColor: "rgba(220,20,20,0.2)",
strokeColor: "purple",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: [65, 59, 80, 81, 56, 55, 40]
}, {
label: "Red Heifers",
fillColor: "rgba(151,187,205,0.9)",
strokeColor: "red",
pointColor: "rgba(151,187,205,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(151,187,205,1)",
data: [28, 48, 40, 19, 86, 27, 90]
}]
};
//Chart options
var options = {
animation: false,
scaleOverride: true,
scaleSteps: 3,
scaleStepWidth: 30,
scaleStartValue: 10,
responsive: true,
maintainAspectRatio: false,
scaleShowGridLines : true,
scaleGridLineColor : "rgba(0,0,0,.05)",
scaleGridLineWidth : 1,
scaleShowHorizontalLines: true,
scaleShowVerticalLines: true,
bezierCurve : false,
bezierCurveTension : 0.4,
pointDot : true,
pointDotRadius : 3,
pointDotStrokeWidth : 1,
pointHitDetectionRadius : 20,
datasetStroke : true,
datasetStrokeWidth : 2,
datasetFill : false
}
//Create the chart, based on above data
var ctx = $("#myChart").get(0).getContext("2d");
var myLineChart = new Chart(ctx).Line(data, options);
来源:
使用chart .js检测图表部分的悬停事件