Как я могу показать подмножество данных на круговых диаграммах в Chart.JS, в то же время отображая суперсет при наведении курсора?
У меня есть круговая диаграмма, которая выглядит так при наведении на кусок пирога:
За исключением желания легендынаправо, а не сверхуЯ довольно доволен этим, но я хочу, чтобы только процентное значение отображалось "все время" в кусочках пирога - и все еще иметь<name> (<%val>): <data>
отображается при наведении.
Другими словами, я хочу, чтобы пирог выглядел примерно так:
Как я могу выделить один кусок данных (процент) и нарисовать его на каждом кусочке пирога?
Вот код, который я использую до сих пор:
var formatter = new Intl.NumberFormat("en-US");
var data = {
labels: [
"Bananas (18%)",
"Lettuce, Romaine (14%)",
"Melons, Watermelon (10%)",
"Pineapple (10%)",
"Berries (10%)",
"Lettuce, Spring Mix (9%)",
"Broccoli (8%)",
"Melons, Honeydew (7%)",
"Grapes (7%)",
"Melons, Cantaloupe (7%)"
],
datasets: [
{
data: [2755, 2256, 1637, 1608, 1603, 1433, 1207, 1076, 1056, 1048],
backgroundColor: [
"#FFE135",
"#3B5323",
"#fc6c85",
"#ffec89",
"#021c3d",
"#3B5323",
"#046b00",
"#cef45a",
"#421C52",
"#FEA620"
]
}
]
};
var optionsPie = {
responsive: true,
scaleBeginAtZero: true,
tooltips: {
callbacks: {
label: function (tooltipItem, data) {
return data.labels[tooltipItem.index] + ": " +
formatter.format(data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]);
}
}
}
};
var ctx = $("#top10ItemsChart").get(0).getContext("2d");
var top10PieChart = new Chart(ctx,
{
type: 'pie',
data: data,
options: optionsPie
});
$("#top10Legend").html(top10PieChart.generateLegend());
Нужно ли добавлять событие afterDraw () и, если да, то как оно должно выглядеть для достижения этой цели?
ОБНОВИТЬЯ попытался добавить обратный вызов onAnimationComplete () в конструктор диаграммы:
var top10PieChart = new Chart(ctx,
{
type: 'pie',
data: data,
options: optionsPie,
onAnimationComplete: function () {
var ctx = this.chart.ctx;
ctx.font = this.scale.font;
ctx.fillStyle = this.scale.textColor;
ctx.textAlign = "center";
ctx.textBaseline = "center";
this.datasets.forEach(function(dataset) {
dataset.points.forEach(function(points) {
ctx.fillText(points.value, points.x, points.y - 10);
});
});
}
});
... но это ничего не делает.
ОБНОВЛЕНИЕ 2Я также попытался добавить следующее к объекту параметров:
,
tooltipTemplate: "<%= value %>",
onAnimationComplete: function () {
this.showTooltip(this.datasets[0].bars, true);
}
... с теми же результатами (без изменений).
ОБНОВЛЕНИЕ 3Хорошо, я надеялся, что ответВот будет работать, и в конечном итоге с этим новым кодом для моей круговой диаграммы на основе ответа там:
Добавлено в опции Пирог:
showTooltips: false,
onAnimationProgress: drawSegmentValues
Добавляется после получения ссылки на элемент:
var midX = canvas.width / 2;
var midY = canvas.height / 2
Добавляется после построения экземпляра круговой диаграммы:
var radius = top10PieChart.outerRadius;
Добавлена функция drawSegmentValues ()
В контексте (не каламбур):
// Top 10 Pie Chart
var formatter = new Intl.NumberFormat("en-US");
var data = {
labels: [
"Bananas (18%)",
"Lettuce, Romaine (14%)",
"Melons, Watermelon (10%)",
"Pineapple (10%)",
"Berries (10%)",
"Lettuce, Spring Mix (9%)",
"Broccoli (8%)",
"Melons, Honeydew (7%)",
"Grapes (7%)",
"Melons, Cantaloupe (7%)"
],
datasets: [
{
data: [2755, 2256, 1637, 1608, 1603, 1433, 1207, 1076
1056, 1048],
backgroundColor: [
"#FFE135",
"#3B5323",
"#fc6c85",
"#ffec89",
"#021c3d",
"#3B5323",
"#046b00",
"#cef45a",
"#421C52",
"#FEA620"
]
}
]
};
var optionsPie = {
responsive: true,
scaleBeginAtZero: true,
legend: {
display: false
},
tooltips: {
callbacks: {
label: function (tooltipItem, data) {
return data.labels[tooltipItem.index] + ": " +
formatter.format
data.datasets[tooltipItem.datasetIndex].data[
tooltipItem.index]);
}
}
},
showTooltips: false,
onAnimationProgress: drawSegmentValues
};
var ctx = $("#top10ItemsChart").get(0).getContext("2d");
var midX = canvas.width / 2;
var midY = canvas.height / 2
, var top10PieChart = new Chart(ctx,
{
type: 'pie',
data: data,
options: optionsPie//,
});
var radius = top10PieChart.outerRadius;
$("#top10Legend").html(top10PieChart.generateLegend());
// </ Top 10 Pie Chart
// Price Compliance Bar Chart
. . . this horizontal bar chart code elided for brevity, bu
unchanged from their working state
// Forecast/Impact Analysis Bar chart
. . . this horizontal bar chart code also elided for brevity, bu
unchanged from their working state
function drawSegmentValues() {
for (var i = 0; i < top10PieChart.segments.length; i++) {
ctx.fillStyle = "white";
var textSize = canvas.width / 10;
ctx.font = textSize + "px Verdana";
// Get needed variables
var value = top10PieChart.segments[i].value;
var startAngle = top10PieChart.segments[i].startAngle;
var endAngle = top10PieChart.segments[i].endAngle;
var middleAngle = startAngle + ((endAngle - startAngle)
2);
// Compute text location
var posX = (radius / 2) * Math.cos(middleAngle) + midX;
var posY = (radius / 2) * Math.sin(middleAngle) + midY;
// Text offside by middle
var w_offset = ctx.measureText(value).width / 2;
var h_offset = textSize / 4;
ctx.fillText(value, posX - w_offset, posY + h_offset);
}
}
... но он полностью скрыл все три графика, не оставляя ничего видимого / рисованного.
ОБНОВЛЕНИЕ 4Кстати, я попробовал данный ответ, но без результата / изменения - он все равно отображает данные при наведении, как и задумывалось, но в остальном ничего нет.
Кроме того, соответствующая скрипка показывает и значение, и процент; Из-за ограничений на недвижимость я хочу, чтобы процент был только «всегда включен» - «вся энчилада» будет видна только при зависании.