2016-09-27 90 views
0

我正在尝试在canvas元素上创建一个pie-chart形状,但是我找不到任何可以自行完成此操作的功能。
有没有简单的方法来做pie chart like below image如何使用html5画布绘制多级饼图?

This pie indicates the progress of each slice

+0

您可以轻松地绘制楔子与不同半径:'context.beginPath(); context.moveTo(centerX,centerY); context.arc(centerX,centerY,radius,startRadianAngle,endRadianAngle); context.closePath(); context.fillStyle = 'yourChosenColor'; context.fill(); context.strokeStyle = '白色'; context.stroke()' – markE

+0

嗨,谢谢你的回复。我尝试了你的建议。请你告诉我如何绘制另一个弧来展示类似上面饼图的弧的进度? –

+0

我已经为您发布了一个快速示例。 – markE

回答

1

这儿有你的起始例如使用可调用的功能,吸引了圆弧:

记住,开始&收弧角Radians。你可以转换为弧度是这样的:radians = degrees * Math.PI/180

var canvas = document.getElementById("canvas"); 
 
var ctx = canvas.getContext("2d"); 
 
var cw=canvas.width; 
 
var ch=canvas.height; 
 
ctx.lineWidth = 2; 
 
ctx.font = '14px verdana'; 
 

 
var PI2 = Math.PI * 2; 
 
var myColor = ["Green", "Red", "Blue"]; 
 
var myData = [30, 15, 38, 22, 30, 20, 10]; 
 
var cx = 150; 
 
var cy = 150; 
 
var radius = 100; 
 

 
ctx.globalAlpha=0.50; 
 
pieChart(myData, myColor); 
 
ctx.globalAlpha=1.00; 
 

 
function pieChart(data, colors){ 
 
    // calc data total 
 
    var total = 0; 
 
    for (var i = 0; i < data.length; i++) { 
 
    total += data[i]; 
 
    } 
 
    // calc sweep angles for each piece of pie 
 
    var sweeps = [] 
 
    for (var i = 0; i < data.length; i++) { 
 
    sweeps.push(data[i]/total * PI2); 
 
    } 
 
    // draw outer pie 
 
    var accumAngle = 0; 
 
    for (var i = 0; i < sweeps.length; i++) { 
 
    var f=randomColor(); 
 
    drawWedge(radius, accumAngle, accumAngle + sweeps[i], f, data[i]); 
 
    accumAngle += sweeps[i]; 
 
    } 
 
    // draw inner percent-complete wedges 
 
    var accumAngle = 0; 
 
    for (var i = 0; i < sweeps.length; i++) { 
 
    var r=radius*(Math.random()*70+20)/100; 
 
    var f=randomColor(); 
 
    drawWedge(r,accumAngle, accumAngle + sweeps[i], f, data[i]); 
 
    accumAngle += sweeps[i]; 
 
    } 
 
} 
 

 
function drawWedge(radius, startAngle, endAngle, fill, label) { 
 
    // draw the wedge 
 
    ctx.beginPath(); 
 
    ctx.moveTo(cx, cy); 
 
    ctx.arc(cx, cy, radius, startAngle, endAngle, false); 
 
    ctx.closePath(); 
 
    ctx.fillStyle = fill; 
 
    ctx.strokeStyle = 'white'; 
 
    ctx.fill(); 
 
    ctx.stroke(); 
 
} 
 

 
function randomColor(){ 
 
    return('#'+(Math.floor(Math.random() * 0x1000000) + 0x1000000).toString(16).substr(1)); 
 
}
body{ background-color: ivory; } 
 
#canvas{border:1px solid red; }
<canvas id="canvas" width=512 height=512></canvas>

+1

谢谢马克,它解决了我的问题。 –

+0

嗨马克,你能帮我添加一个标签悬停的每个弧 –

+0

嘿,家人让我时间不够,所以你可能会发布另一个关于悬停标签的问题:-) – markE