在Chart.js上显示自定义tooltip

Chart.js允许通过HTML5的canvas进行图表绘制。这里我们希望绘制一个环形图,点击图上各segment时可以显示自定义的圆形tooltip。


Chart.js支持通过几个变量添加tooltip,它提供一个tooltipTemplate但是却不支持自定义tooltip的HTML!于是决定自行绘制tooltip手动添加上去。


1. 绘制一个tooltip

CSS:

.ft{
background:#bbaabb;
position:absolute;
left:100px;
top:150px;
}

.circle{
width:100px;
height:100px;
border-radius:50px;
font-size:20px;
color:#fff;
line-height:100px;
text-align:center;
background:#aa9966}


HTML:

<div id="t" class="ft circle">$100.23M</div>


2. 通过Chart.js绘制一个环形图

HTML:

<canvas id="myChart" width="390" height="390"></canvas>

JS:

    var data = [{
        value: 30,
        color: "#FA797A",
        highlight: "#F7464A"
    }, {
        value: 50,
        color: "#E2EAE9",
        highlight: "#E1D9D9"
    }, {
        value: 100,
        color: "#D4CCC5",
        highlight: "#D2BCB5"
    }, {
        value: 40,
        color: "#949FB1",
        highlight: "#928EA1"
    }, {
        value: 120,
        highlight: "#C69CBE",
        color: "#C89DCE"
    }

    ]

    var options = {
        animation: false, 
        showTooltips: true,
        segmentStrokeWidth:2,
        percentageInnerCutout:80,
        segmentShowStroke : true,
        segmentStrokeColor : "#fff",
        tooltipTemplate : "",
        tooltipEvents: ["mousemove", "touchstart", "touchmove"],
        
    };


    //Get the context of the canvas element we want to select
    var c = $('#myChart');
    var ct = c.get(0).getContext('2d');
    var ctx = document.getElementById("myChart").getContext("2d");

   
    /*************************************************************************/
    myNewChart = new Chart(ct).Doughnut(data, options);

}

    

3. 每当我点击一个segment的时候,需要自定义的tooltip出现在该segment中心位置。所以需要计算segment中心的坐标

var calc = function(startAngle, endAngle, outerRadius, innerRadius ,x,y ){
     var centreAngle = startAngle + ((endAngle - startAngle) / 2);
     var rangeFromCentre = (outerRadius - innerRadius) / 2 + innerRadius;
       return {
         x : x + (Math.cos(centreAngle) * rangeFromCentre),
         y : y + (Math.sin(centreAngle) * rangeFromCentre)
        };
}

这个function中,需要提供segment初始和最终的角度,环形内外圆半径和环形中心坐标。这些数值我们可以通过以下方式获得

var activePoints = myNewChart.getSegmentsAtEvent(e);
             
var chart = $("#myChart");
var chartCenterX = chart.position().left + chart.width()/2;
var chartCenterY = chart.position().top + chart.height()/2;

var arc = activePoints[0];
var arcCenter = calc(arc.startAngle, arc.endAngle, arc.outerRadius, arc.innerRadius, chartCenterX, chartCenterY);
var arcCenterX = arcCenter.x;
var arcCenterY = arcCenter.y;

4. 最后设置只有当在任意segment上点击的时候才出现tooltip

HTML: 将tooltip改为初始不可见

<div id="t" class="ft circle" style="display:none" >$100.23M</div>

JS: 在计算出的中心位置显示tooltip

   $(".ft").css({"left": arcCenterX-$("#t").width()/2, "top":arcCenterY-$("#t").height()/2, "display":"block"}); 
   $(".ft").text("$"+arc.value+"M");
   $(".ft").show();



具体代码见: http://jsfiddle.net/NXPhL/277/


Chart.js 是一个流行的 JavaScript 图表库,可以用来创建多种图表,包括柱状图。要在柱状图上方显示自定义的数值,你可以通过在数据集(datasets)中添加一个 `label` 属性来实现,这个属性会作为图例显示。对于每个柱体,你还可以使用 `hover` 事件的 `tooltip` 配置来自定义鼠标悬停时显示的文本。 以下是一个简单的示例,展示如何在 Chart.js 中创建一个带有自定义数值的柱状图: 1. 引入 Chart.js 库。 2. 准备数据和配置选项。 3. 使用 `datasets` 数组,在其中的每个对象上设置 `label` 属性来显示自定义数值。 ```javascript // 引入 Chart.js 库 var ctx = document.getElementById('myChart').getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', // 图表类型为柱状图 data: { labels: ['红色', '蓝色', '黄色', '绿色', '橙色', '紫色'], // X轴的标签 datasets: [{ label: '自定义数值', // 在柱状图上方显示的数值 data: [12, 19, 3, 5, 2, 3], // 柱体的数据 backgroundColor: [ 'rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', 'rgba(255, 159, 64, 0.2)' ], borderColor: [ 'rgba(255, 99, 132, 1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)' ], borderWidth: 1 }] }, options: { scales: { y: { beginAtZero: true } } } }); ``` 对应的 HTML 结构可能如下所示: ```html <canvas id="myChart" width="400" height="400"></canvas> ``` 这个例子中,`labels` 数组定义了 X 轴上的标签,`data` 数组定义了每个柱体的高度,而 `datasets` 中的 `label` 属性则定义了显示在每个柱体上方的数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值