Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTML5 Canvas pie chart

I'm attempting to create a simple pie chart like shown in the graphic below:

enter image description here

The chart will show the results for a quiz where a user can choose either a, b or c. They're 10 questions and the user can only choose one option per question.

What I want to do is show the pie chart with each segment being a percentage of 100% by passing in the values for either a,b, or c.

I have the following so far:

var greenOne = "#95B524";  var greenTwo = "#AFCC4C";  var greenThree = "#C1DD54";    function CreatePieChart() {    var chart = document.getElementById('piechart');    var canvas = chart.getContext('2d');    canvas.clearRect(0, 0, chart.width, chart.height);      var total = 100;      var a = 3;    var b = 4;    var c = 3;      for (var i = 0; i < 3; i++) {      canvas.fillStyle = "#95B524";      canvas.beginPath();      canvas.strokeStyle = "#fff";      canvas.lineWidth = 3;      canvas.arc(100, 100, 100, 0, Math.PI * 2, true);      canvas.closePath();      canvas.stroke();      canvas.fill();    }  }  CreatePieChart();
<canvas id="piechart" width="200" height="200"></canvas>

The colors are specific to the size of the segment, so green one is used for the largest and green three for the smallest.

Thanks

like image 736
Cameron Avatar asked Aug 09 '11 11:08

Cameron


People also ask

Is HTML5 canvas still used?

The HTML5 canvas has the potential to become a staple of the web, enjoying ubiquitous browser and platform support in addition to widespread webpage support, as nearly 90% of websites have ported to HTML5.


1 Answers

Even after searching Google and triple-checking my radians values, etc. I was still having trouble with this, so I have created a jsFiddle for people to play with as a live example and will post the code below as well. (Update: in the fiddle v2, stroke and labels are added also.)

var canvas = document.getElementById("can"); var ctx = canvas.getContext("2d"); var lastend = 0; var data = [200, 60, 15]; // If you add more data values make sure you add more colors var myTotal = 0; // Automatically calculated so don't touch var myColor = ['red', 'green', 'blue']; // Colors of each slice  for (var e = 0; e < data.length; e++) {   myTotal += data[e]; }  for (var i = 0; i < data.length; i++) {   ctx.fillStyle = myColor[i];   ctx.beginPath();   ctx.moveTo(canvas.width / 2, canvas.height / 2);   // Arc Parameters: x, y, radius, startingAngle (radians), endingAngle (radians), antiClockwise (boolean)   ctx.arc(canvas.width / 2, canvas.height / 2, canvas.height / 2, lastend, lastend + (Math.PI * 2 * (data[i] / myTotal)), false);   ctx.lineTo(canvas.width / 2, canvas.height / 2);   ctx.fill();   lastend += Math.PI * 2 * (data[i] / myTotal); }
<canvas id="can" width="200" height="200" />
like image 137
Alex W Avatar answered Sep 27 '22 20:09

Alex W