我在我的php页面中使用Chart.js绘制饼图。我发现工具提示显示每个切片值。
我不知道如何使用chart.js。
请帮帮我。
我的Javascript代码:
function drawPie(canvasId,data,legend){
var ctx = $("#pie-canvas-" + canvasId).get(0).getContext("2d");
var piedata = [];
$.each(data,function(i,val){
piedata.push({value:val.count,color:val.color,label:val.status});
});
var options =
{
tooltipTemplate: "<%= Math.round(circumference / 6.283 * 100) %>%",
}
var pie = new Chart(ctx).Pie(piedata,options);
if(legend)document.getElementById("legend").innerHTML = pie.generateLegend();
}
php代码:
printf('<table><tr>');
echo '<td style="text-align: right;"><canvas id="pie-canvas-'
. $canvasId
. '" width="256" height="256" ></canvas></td><td style="text-align: left;width:360px;height:auto" id="legend" class="chart-legend"></td></tr></table>';
echo '<script type="text/javascript">drawPie('
. $canvasId
. ', '
. $data3
.', '
. $legend
. ');</script>';
答案 0 :(得分:52)
对于 Chart.js 2.0 及以上,Chart对象数据已更改。对于使用Chart.js 2.0+的用户,下面是使用HTML5 Canvas Invoke
方法在饼图切片内显示数据值的示例。该代码也适用于圆环图,创建图表时唯一的区别是fillText()
与type: 'pie'
。
<强>脚本:强>
的Javascript
type: 'doughnut'
HTML
var data = {
datasets: [{
data: [
11,
16,
7,
3,
14
],
backgroundColor: [
"#FF6384",
"#4BC0C0",
"#FFCE56",
"#E7E9ED",
"#36A2EB"
],
label: 'My dataset' // for legend
}],
labels: [
"Red",
"Green",
"Yellow",
"Grey",
"Blue"
]
};
var pieOptions = {
events: false,
animation: {
duration: 500,
easing: "easeOutQuart",
onComplete: function () {
var ctx = this.chart.ctx;
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
this.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 x = mid_radius * Math.cos(mid_angle);
var y = mid_radius * Math.sin(mid_angle);
ctx.fillStyle = '#fff';
if (i == 3){ // Darker text color for lighter background
ctx.fillStyle = '#444';
}
var percent = String(Math.round(dataset.data[i]/total*100)) + "%";
//Don't Display If Legend is hide or value is 0
if(dataset.data[i] != 0 && dataset._meta[0].data[i].hidden != true) {
ctx.fillText(dataset.data[i], model.x + x, model.y + y);
// Display percent in another line, line break doesn't work for fillText
ctx.fillText(percent, model.x + x, model.y + y + 15);
}
}
});
}
}
};
var pieChartCanvas = $("#pieChart");
var pieChart = new Chart(pieChartCanvas, {
type: 'pie', // or doughnut
data: data,
options: pieOptions
});
答案 1 :(得分:20)
我找到了一个出色的Chart.js
插件,可以完全按照您的要求执行操作:
https://github.com/emn178/Chart.PieceLabel.js
答案 2 :(得分:15)
据我所知,我不相信Chart.JS有任何功能可以帮助在饼图上绘制文字。但这并不意味着您无法在本机JavaScript中自行完成。我将举例说明如何做到这一点,下面是饼图中每个段的绘图文本代码:
function drawSegmentValues()
{
for(var i=0; i<myPieChart.segments.length; i++)
{
// Default properties for text (size is scaled)
ctx.fillStyle="white";
var textSize = canvas.width/10;
ctx.font= textSize+"px Verdana";
// Get needed variables
var value = myPieChart.segments[i].value;
var startAngle = myPieChart.segments[i].startAngle;
var endAngle = myPieChart.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 to middle of text
var w_offset = ctx.measureText(value).width/2;
var h_offset = textSize/4;
ctx.fillText(value, posX - w_offset, posY + h_offset);
}
}
饼图包含存储在PieChart.segments
中的一系列细分,我们可以查看这些细分的startAngle
和endAngle
,以确定文本所在位置之间的角度{ {1}}。然后我们将middleAngle
向那个方向移动,以弧度表示在图表的中间点。
在上面的示例中,由于Radius/2
中绘制的文本的位置是右上角,因此完成了一些其他清理操作,我们需要获取一些偏移值来纠正它。最后fillText()
是根据图表本身的大小确定的,图表越大,文本越大。
通过稍微修改,您可以将数据集的离散数值更改为图表中的百分位数。要执行此操作,请获取数据集中项目的总textSize
,并调用此value
。然后在每个细分中,您可以通过以下方式找到百分比:
totalValue
此处Math.round(myPieChart.segments[i].value/totalValue*100)+'%';
部分用于计算细分在图表中占据的百分比。例如,如果当前细分的值为myPieChart.segments[i].value/totalValue
且totalValue为50
。然后,该细分受众群的百分比为:200
。剩下的就是让它看起来不错。 50/200 => 0.25
,然后我们在最后添加0.25*100 => 25
。对于整数百分比的图块,我舍入到最接近的整数,但可能会导致准确性问题。如果我们需要更高的准确度,您可以使用%
来保存小数位。例如,我们可以在需要时保存一个小数位:
.toFixed(n)
答案 3 :(得分:10)
答案 4 :(得分:1)
@Hung Tran的回答非常完美。作为改进,我建议不要显示0的值。假设您有5个元素,其中2个为0,其余的都有值,上面的解决方案将显示0和0%。最好用不等于0的检查来过滤掉它!
var val = dataset.data[i]; var percent = String(Math.round(val/total*100)) + "%"; if(val != 0) { ctx.fillText(dataset.data[i], model.x + x, model.y + y); // Display percent in another line, line break doesn't work for fillText ctx.fillText(percent, model.x + x, model.y + y + 15); }
以下更新的代码:
var data = {
datasets: [{
data: [
11,
16,
7,
3,
14
],
backgroundColor: [
"#FF6384",
"#4BC0C0",
"#FFCE56",
"#E7E9ED",
"#36A2EB"
],
label: 'My dataset' // for legend
}],
labels: [
"Red",
"Green",
"Yellow",
"Grey",
"Blue"
]
};
var pieOptions = {
events: false,
animation: {
duration: 500,
easing: "easeOutQuart",
onComplete: function () {
var ctx = this.chart.ctx;
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
this.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 x = mid_radius * Math.cos(mid_angle);
var y = mid_radius * Math.sin(mid_angle);
ctx.fillStyle = '#fff';
if (i == 3){ // Darker text color for lighter background
ctx.fillStyle = '#444';
}
var val = dataset.data[i];
var percent = String(Math.round(val/total*100)) + "%";
if(val != 0) {
ctx.fillText(dataset.data[i], model.x + x, model.y + y);
// Display percent in another line, line break doesn't work for fillText
ctx.fillText(percent, model.x + x, model.y + y + 15);
}
}
});
}
}
};
var pieChartCanvas = $("#pieChart");
var pieChart = new Chart(pieChartCanvas, {
type: 'pie', // or doughnut
data: data,
options: pieOptions
});
答案 5 :(得分:0)
提供饼图选项
onAnimationProgress:drawSegmentValues 喜欢:
var pOptions = {
onAnimationProgress: drawSegmentValues
};
var pieChart = new Chart(pieChartCanvas, {
type: 'pie', // or doughnut
data: data,
options: pOptions
});
答案 6 :(得分:-2)
使用Chartjs的最简单方法。只需在选项中添加以下行即可:
pieceLabel: {
fontColor: '#000'
}
祝你好运