如何移动标签在 Chart.js 饼图上的位置
How to move labels' position on Chart.js pie
我正在使用 Chart.js 并尝试将饼图上的标签移到饼图区域之外(见红色 X):
这是我现在的代码:
<div class="container" id="pieContainer">
<h4 class="title">Title</h4>
<center><canvas id="pie"></canvas></center>
</div>
<script>
var pieData = [
{
value: 39,
color:"#335478",
label: "Blue"
},
{
value : 4,
color : "#7f7f7f",
label: "Grey"
},
{
value : 57,
color : "#99cb55",
label: "Green"
}
];
var optionsPie = {
responsive : true,
tooltipEvents: [],
showTooltips: true,
onAnimationComplete: function() {
this.showTooltip(this.segments, true);
},
tooltipTemplate: "<%= label %> - <%= value %>%"
};
new Chart(document.getElementById("pie").getContext("2d")).Pie(pieData, optionsPie);
</script>
我不想使用图例,也找不到移动标签的内置方法。有没有办法在不改变 chart.js
的情况下做到这一点?实现我的目标的最佳方式是什么?
您似乎控制了工具提示的 x 和 y 位置:
var myPieChart = new Chart(ctx).Pie(data, {
customTooltips: function(tooltip) {
// tooltip will be false if tooltip is not visible or should be hidden
if (!tooltip) {
return;
}
// Otherwise, tooltip will be an object with all tooltip properties like:
// tooltip.caretHeight
// tooltip.caretPadding
// tooltip.chart
// tooltip.cornerRadius
// tooltip.fillColor
// tooltip.font...
// tooltip.text
// tooltip.x
// tooltip.y
// etc...
};
});
看看http://www.chartjs.org/docs/#doughnut-pie-chart-chart-options
只需扩展图表即可。如果您的标签是静态的,那么只更改 tooltipPosition
方法可能会更简单。
预览
脚本
Chart.types.Pie.extend({
name: "PieAlt",
initialize: function(data){
Chart.types.Pie.prototype.initialize.apply(this, arguments);
var requiredSpace = 0;
for (var i = 0; i < data.length; i++)
requiredSpace = Math.max(ctx.measureText(Chart.helpers.template(this.options.tooltipTemplate, data[i])).width, requiredSpace);
this.outerRadius -= (requiredSpace + 20);
},
draw: function(data){
Chart.types.Pie.prototype.draw.apply(this, arguments);
var self = this;
ctx.save();
ctx.font = Chart.helpers.fontString(self.options.scaleFontSize, self.options.scaleFontStyle, self.options.scaleFontFamily);
ctx.textBaseline = "middle";
self.segments.forEach(function (segment) {
var outerEdge = Chart.Arc.prototype.tooltipPosition.apply({
x: this.chart.width / 2,
y: this.chart.height / 2,
startAngle: segment.startAngle,
endAngle: segment.endAngle,
outerRadius: segment.outerRadius * 2 + 20,
innerRadius: 0
})
var normalizedAngle = (segment.startAngle + segment.endAngle) / 2;
while (normalizedAngle > 2 * Math.PI) {
normalizedAngle -= (2 * Math.PI)
}
if (normalizedAngle < (Math.PI * 0.4) || (normalizedAngle > Math.PI * 1.5))
ctx.textAlign = "start";
else if (normalizedAngle > (Math.PI * 0.4) && (normalizedAngle < Math.PI * 0.6)) {
outerEdge.y += 5;
ctx.textAlign = "center";
}
else if (normalizedAngle > (Math.PI * 1.4) && (normalizedAngle < Math.PI * 1.6)) {
outerEdge.y - 5;
ctx.textAlign = "center";
}
else
ctx.textAlign = "end";
ctx.fillText(Chart.helpers.template(self.options.tooltipTemplate, segment), outerEdge.x, outerEdge.y);
});
ctx.restore();
}
});
然后
new Chart(ctx).PieAlt(data, {
showTooltips: false
});
Fiddle - http://jsfiddle.net/h8rggkhp/
我最近 运行 遇到了同样的问题,chartsjs-plugin-label 为我解决了这个问题。
示例:
import {Chart} from 'chartjs';
import 'chartjs-plugin-labels';
let options = {
plugins: {
labels: {
position: 'outside',
render: (args) => {
return `${args.label}: ${args.value}%`;
}
}
}
}
let data = {
datasets: [
{
data: [39, 4, 57],
labels: ['Blue', 'Gray', 'Green'],
},
],
}
new Chart(ctx, {
type: 'pie',
data: data,
options: options
}
如果你想要像这样带有外标的尖线
然后使用 chartjs-plugin-piechart-outlabels
npm link
我正在使用 Chart.js 并尝试将饼图上的标签移到饼图区域之外(见红色 X):
这是我现在的代码:
<div class="container" id="pieContainer">
<h4 class="title">Title</h4>
<center><canvas id="pie"></canvas></center>
</div>
<script>
var pieData = [
{
value: 39,
color:"#335478",
label: "Blue"
},
{
value : 4,
color : "#7f7f7f",
label: "Grey"
},
{
value : 57,
color : "#99cb55",
label: "Green"
}
];
var optionsPie = {
responsive : true,
tooltipEvents: [],
showTooltips: true,
onAnimationComplete: function() {
this.showTooltip(this.segments, true);
},
tooltipTemplate: "<%= label %> - <%= value %>%"
};
new Chart(document.getElementById("pie").getContext("2d")).Pie(pieData, optionsPie);
</script>
我不想使用图例,也找不到移动标签的内置方法。有没有办法在不改变 chart.js
的情况下做到这一点?实现我的目标的最佳方式是什么?
您似乎控制了工具提示的 x 和 y 位置:
var myPieChart = new Chart(ctx).Pie(data, {
customTooltips: function(tooltip) {
// tooltip will be false if tooltip is not visible or should be hidden
if (!tooltip) {
return;
}
// Otherwise, tooltip will be an object with all tooltip properties like:
// tooltip.caretHeight
// tooltip.caretPadding
// tooltip.chart
// tooltip.cornerRadius
// tooltip.fillColor
// tooltip.font...
// tooltip.text
// tooltip.x
// tooltip.y
// etc...
};
});
看看http://www.chartjs.org/docs/#doughnut-pie-chart-chart-options
只需扩展图表即可。如果您的标签是静态的,那么只更改 tooltipPosition
方法可能会更简单。
预览
脚本
Chart.types.Pie.extend({
name: "PieAlt",
initialize: function(data){
Chart.types.Pie.prototype.initialize.apply(this, arguments);
var requiredSpace = 0;
for (var i = 0; i < data.length; i++)
requiredSpace = Math.max(ctx.measureText(Chart.helpers.template(this.options.tooltipTemplate, data[i])).width, requiredSpace);
this.outerRadius -= (requiredSpace + 20);
},
draw: function(data){
Chart.types.Pie.prototype.draw.apply(this, arguments);
var self = this;
ctx.save();
ctx.font = Chart.helpers.fontString(self.options.scaleFontSize, self.options.scaleFontStyle, self.options.scaleFontFamily);
ctx.textBaseline = "middle";
self.segments.forEach(function (segment) {
var outerEdge = Chart.Arc.prototype.tooltipPosition.apply({
x: this.chart.width / 2,
y: this.chart.height / 2,
startAngle: segment.startAngle,
endAngle: segment.endAngle,
outerRadius: segment.outerRadius * 2 + 20,
innerRadius: 0
})
var normalizedAngle = (segment.startAngle + segment.endAngle) / 2;
while (normalizedAngle > 2 * Math.PI) {
normalizedAngle -= (2 * Math.PI)
}
if (normalizedAngle < (Math.PI * 0.4) || (normalizedAngle > Math.PI * 1.5))
ctx.textAlign = "start";
else if (normalizedAngle > (Math.PI * 0.4) && (normalizedAngle < Math.PI * 0.6)) {
outerEdge.y += 5;
ctx.textAlign = "center";
}
else if (normalizedAngle > (Math.PI * 1.4) && (normalizedAngle < Math.PI * 1.6)) {
outerEdge.y - 5;
ctx.textAlign = "center";
}
else
ctx.textAlign = "end";
ctx.fillText(Chart.helpers.template(self.options.tooltipTemplate, segment), outerEdge.x, outerEdge.y);
});
ctx.restore();
}
});
然后
new Chart(ctx).PieAlt(data, {
showTooltips: false
});
Fiddle - http://jsfiddle.net/h8rggkhp/
我最近 运行 遇到了同样的问题,chartsjs-plugin-label 为我解决了这个问题。
示例:
import {Chart} from 'chartjs';
import 'chartjs-plugin-labels';
let options = {
plugins: {
labels: {
position: 'outside',
render: (args) => {
return `${args.label}: ${args.value}%`;
}
}
}
}
let data = {
datasets: [
{
data: [39, 4, 57],
labels: ['Blue', 'Gray', 'Green'],
},
],
}
new Chart(ctx, {
type: 'pie',
data: data,
options: options
}
如果你想要像这样带有外标的尖线
然后使用 chartjs-plugin-piechart-outlabels
npm link