我有一个使用Chart.js的圆环图,它正确显示了我的应用的登录数据,但是我修改了图表,以便登录总数以文本形式显示在中间的剪切块中:
我遇到的问题是工具提示。当我将鼠标悬停在饼图的浅青色部分上时,如果图表缩小,则工具提示会被中间的文本覆盖,如下所示:
我希望能够改变工具提示的延伸方向,使其不再向中心延伸,而是向远处移动,这样工具提示和中心分析都可见,但我还没有找到一个关于如何改变工具提示位置的简明解释。以下是我目前拥有的代码:
var loslogged = dataset[0][0].loslogged;
var realtorlogged = dataset[1][0].realtorlogged;
var borrowerlogged = dataset[2][0].borrowerlogged;
var totallogged = parseInt(loslogged) + parseInt(realtorlogged) + parseInt(borrowerlogged);
Chart.pluginService.register({
afterDraw: function (chart) {
if (chart.config.options.elements.center) {
var helpers = Chart.helpers;
var centerX = (chart.chartArea.left + chart.chartArea.right) / 2;
var centerY = (chart.chartArea.top + chart.chartArea.bottom) / 2;
var ctx = chart.chart.ctx;
ctx.save();
var fontSize = helpers.getValueOrDefault(chart.config.options.elements.center.fontSize, Chart.defaults.global.defaultFontSize);
var fontStyle = helpers.getValueOrDefault(chart.config.options.elements.center.fontStyle, Chart.defaults.global.defaultFontStyle);
var fontFamily = helpers.getValueOrDefault(chart.config.options.elements.center.fontFamily, Chart.defaults.global.defaultFontFamily);
var font = helpers.fontString(fontSize, fontStyle, fontFamily);
ctx.font = font;
ctx.fillStyle = helpers.getValueOrDefault(chart.config.options.elements.center.fontColor, Chart.defaults.global.defaultFontColor);
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(chart.config.options.elements.center.text, centerX, centerY);
ctx.restore();
}
}
});
var loginChartData = {
labels: ["Loan Officers","Realtors","Borrowers"],
datasets: [{
label: "Number of Logins",
data: [loslogged, realtorlogged, borrowerlogged],
backgroundColor: [
"rgba(191, 25, 25, 0.75)",
"rgba(58, 73, 208, 0.75)",
"rgba(79, 201, 188, 0.75)"
],
borderColor: [
"rgba(255, 255, 255, 1)",
"rgba(255, 255, 255, 1)",
"rgba(255, 255, 255, 1)"
],
borderWidth: 4
}],
gridLines: {
display: false
}
};
var loginChartOptions = {
title: {
display: false
},
cutoutPercentage: 50,
elements: {
center: {
text: totallogged,
fontColor: '#000',
fontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
fontSize: 36,
fontStyle: 'bold'
}
}
};
var loginChart = document.getElementById('loginsChart').getContext('2d');
new Chart(loginChart, {
type: 'doughnut',
data: loginChartData,
options: loginChartOptions
});
3条答案
按热度按时间lyr7nygr1#
在以前的chart.js版本(v2.3及更早版本)中,反转工具提示要容易得多,只需覆盖
determineAlignment
工具提示方法并反转逻辑即可。然而从v2.4开始,计算工具提示位置的函数(包括
determineAlignment
)被私有化,所以不再有简单地覆盖它们的方法(相反,你必须复制它们)。下面是一个有效的反向工具提示解决方案,不幸的是,它需要从chart.js源代码中进行大量的复制和粘贴(这是必需的,因为方法是私有的)。这种方法的风险是,底层的私有函数可能在新版本中随时发生变化,新的反向工具提示可能会意外中断。
尽管如此,这里是实现的演练(底部有一个codepen示例)。
1)首先,让我们扩展
Chart.Tooltip
对象并创建一个新的Chart.ReversedTooltip
对象。实际上,我们只需要覆盖update
方法,因为它执行所有的定位逻辑。实际上,这种覆盖只是从源代码直接复制和粘贴,因为我们实际上只需要修改update
调用的私有determineAlignment
方法。2)正如您所看到的,
update
方法使用了一些私有方法(例如getBaseModel
、createTooltipItem
、determineAlignment
等)。为了使我们的update
方法能够实际工作,我们必须为每一个方法提供一个实现。2这里又是一个从源代码复制粘贴的例子。然而,我们唯一需要修改的方法是determineAlignment
方法,下面是修改后的版本,它颠倒了对齐逻辑。3)现在我们的新
Chart.ReversedTooltip
已经完成了,我们需要使用插件系统将原来的工具提示改为我们的反向工具提示。我们可以使用afterInit
插件方法来完成这一点。最后,我们终于有了反向的工具提示!在这个codepen上查看一个完整的工作示例。
同样值得一提的是,这种方法非常脆弱,而且,正如我提到的,很容易超时(由于需要复制和粘贴)。另一种选择是使用自定义工具提示,并将其放置在图表上您希望的任何位置。
看看这个chart.js sample,它展示了如何设置和使用一个自定义的工具提示。你可以使用这个方法,只是修改定位逻辑。
7fhtutme2#
如果您有一个小的工具提示标签,您可以使用简单的chart.js选项来修复重叠问题:
sqxo8psd3#
我设法解决了同样的问题,将甜甜圈 Package 器div的zIndex设置为1,将显示在甜甜圈中间的文本的zIndex设置为-1,画布默认是透明的。希望这能有所帮助。