Nesta matéria vou mostrar como obter um gráfico tipo pizza a partir de uma tabela de dados.
Vamos usar o elemento canvas
da HTML 5 e um código JavaScript para atingir nosso propósito. É sabido que o Internet Explorer, versões atuais, não suportam o elemento canvas
, mas a novidade nesta matéria é apresentar um script denominado Explorer Canvas que faz o IE suportar o elemento canvas
.
Observe na figura a seguir um screenshot da renderização do que iremos obter no final da matéria.
Visite uma página demonstração para a técnica descrita.
E aqui estão os ingredientes da receita:
canvas
;canvas
.canvas
<canvas id="canvas" width="300" height="300"></canvas>
<table id="mydata"> <thead> <tr> <th>Linguagem</th> <th>Valor</th> </tr> </thead> <tbody> <tr> <td>JavaScript</td> <td>100</td> </tr> <tr> <td>CSS</td> <td>200</td> </tr> <tr> <td>HTML</td> <td>300</td> </tr> <tr> <td>PHP</td> <td>50</td> </tr> <tr> <td>MySQL</td> <td>30</td> </tr> <tr> <td>Apache</td> <td>10</td> </tr> <tr><td>Linux</td> <td>30</td> </tr> </tbody> </table>
Vamos começar com algumas configurações. Iremos informar ao script qual é o id
da tabela de dados, o id
do elemento canvas
e a coluna que contém os dados:
// a tabela e o elemento canvas na marcação HTML var data_table = document.getElementById('mydata'); var canvas = document.getElementById('canvas'); var td_index = 1; // qual td comtém os dados
A seguir vamos selecionar todas a linhas da tabela (tr’s) e criar um loop por elas selecionando suas células (td’s). Continuando adicionaremos os dados da tabela em um array e obteremos o total de dados na coluna. Criamos um array de cores randômicas. Colorimos cada uma das linhas da tabela com uma cor randômica selecionada (veremos a função para selecionar a cor, denominada getColor()
, logo adiante)
var tds, data = [], color, colors = [], value = 0, total = 0; var trs = data_table.getElementsByTagName('tr'); // todas as tr's for (var i = 0; i < trs.length; i++) { tds = trs[i].getElementsByTagName('td'); // todas as td's if (tds.length === 0) continue; // não há td's, vá em frente // extrair o valor da td e atualizar o total value = parseFloat(tds[td_index].innerHTML); data[data.length] = value; total += value; // cor randômica color = getColor(); colors[colors.length] = color; // armazena trs[i].style.backgroundColor = color; // colorir a tr }
canvas
Chegou a hora da parte divertida, desenhar! Primeiro precisamos criar o objeto contexto para canvas
. A seguir estabelecer o raio e o centro do gráfico de pizza, tudo isto tendo em vista as dimensões de canvas
:
// estabelecer contexto e definir raio e centro var ctx = canvas.getContext('2d'); var canvas_size = [canvas.width, canvas.height]; var radius = Math.min(canvas_size[0], canvas_size[1]) / 2; var center = [canvas_size[0]/2, canvas_size[1]/2];
A seguir vamos criar um loop pelos dados da tabela e colorir os segmentos do gráfico. Para desenhar um segmento usaremos os seguintes métodos do objeto contexto:
Observe a seguir o código para o desenho:
var sofar = 0; // monitora o andamento do script // loop por data[] for (var piece in data) { var thisvalue = data[piece] / total; ctx.beginPath(); ctx.moveTo(center[0], center[1]); // centro do gráfico ctx.arc( // desenha próximo arco center[0], center[1], radius, Math.PI * (- 0.5 + 2 * sofar), // -0.5 define o início no topo Math.PI * (- 0.5 + 2 * (sofar + thisvalue)), false ); ctx.lineTo(center[0], center[1]); // linha de retorno ao centro ctx.closePath(); ctx.fillStyle = colors[piece]; // cor ctx.fill(); sofar += thisvalue; // incrementa o andamento do script }
O script da função para definir uma cor randômica é mostrado a seguir:
// gera uma cor randômica function getColor() { var rgb = []; for (var i = 0; i < 3; i++) { rgb[i] = Math.round(100 * Math.random() + 155) ; // [155-255] = lighter colors } return 'rgb(' + rgb.join(',') + ')'; }
Isto é tudo! Divirta-se com seu gráfico de pizza 😀
Créditos:
Author: Stoyan Stefanov
URL do artigo original: http://www.phpied.com/canvas-pie/
Em 2006 comecei a publicar nesse blog uma série de desafios CSS que consistiam em…
Há muito tempo que eu não publico um "Teste seu conhecimento". Esta semana, revendo algumas…
Introdução Elementos da marcação HTML podem ser aninhados uns dentro de outros, criando-se uma cadeia…
HTML5? Web universal? É comum eu me deparar com dúvidas sobre a HTML5 não só…
Quem é Tab Atkins Jr? Tab Atkins Jr, um desenvolvedor americano, trabalhou durante muitos anos…
Pessoal, a BrazilJS Conf 2013 disponibilizou para o Maujor cupons de desconto para serem oferecidos…
View Comments
Otimo trabalho
Obrigada por compartilhar seu conhecimento , parabéns pelo blog
digo 'automaticamente'
function getColor() Muito interessante esta função de cores mas não entendi onde ela busca os arquivos de cores automático
Obrigado pela dica, valeu. Como sempre nota 1000 seu blog
Julia
Ótimo tuto maujor. Valeu.
Parabéns pelo post.
Obrigado pela dica.
Obrigado pela dica.
Parabéns pelo blog!