【发布时间】:2017-02-17 10:05:11
【问题描述】:
我需要绘制具有许多值(其中一部分接近)和长值标签的图表。这些值应显示在图表上(而不是图例)。我正在使用以下插件来显示标签:
var drawItemsValuesPlugin = {
afterDraw: function(chartInstance) {
var ctx = chartInstance.chart.ctx;
// render the value of the chart above the bar
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
ctx.strokeStyle = 'black';
ctx.font = "bold 11pt Arial";
ctx.lineWidth = 0.3;
chartInstance.data.datasets.forEach(function (dataset) {
for (var i = 0; i < dataset.data.length; i++) {
var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
total = dataset._meta[Object.keys(dataset._meta)[0]].total,
mid_radius = model.innerRadius + (model.outerRadius - model.innerRadius)/2,
start_angle = model.startAngle,
end_angle = model.endAngle,
mid_angle = start_angle + (end_angle - start_angle)/2;
var fact = (chartInstance.config.type == 'pie'?
(i%2==0?1:1.6):
(i%2==0?0.9:1.1)
);
var x = mid_radius * fact * Math.cos(mid_angle);
var y = mid_radius * fact * Math.sin(mid_angle);
ctx.fillStyle = '#fff';
var label = chartInstance.config.data.labels[i];
var percent = String(Math.round(dataset.data[i]/total*100)) + "%";
ctx.fillText(label, model.x + x, model.y + y);
ctx.strokeText(label, model.x + x, model.y + y);
// Display percent in another line, line break doesn't work for fillText
ctx.fillText(dataset.data[i] + ' ('+percent+')', model.x + x, model.y + y + 15);
ctx.strokeText(dataset.data[i] + ' ('+percent+')', model.x + x, model.y + y + 15);
}
});
}
};
但我面临以下问题:
值标签是杂乱无章的。一个简单的解决方案是将标签围绕图表放置,如下图所示:
如何使用 Chart JS 2.0 获取此标签位置?
【问题讨论】:
-
你可以试试:
mid_radius = 1.2 * model.outerRadius;,看看你会得到什么。
标签: javascript charts html5-canvas chart.js