Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Solução código - Barras

Ola galera,

Este é o 3 exercício desta série e cada vez aumentando seu grau de dificuldade.

Deu dor de cabeça. Passei 2 dias pensando e resolvendo os erros para fazer, pois tentei trazer alguma coisa melhor que as anteriores, senão não teria graça. Sendo assim segue abaixo meu código.

Não sei se teria alguma expressão que deixa se o código mais limpo, porque foi através dos testes e falhas que consegui chegar neste resultado.

Espero que gostem.

<meta charset="UTF-8">

<h1><center>..:: Gráfico de barras ::..</center></h1>
<h3>% dos navegadores utilizavam em 2015 e 2016</h3>
<h4>Valores em:</h4>
<p><b>2015:</b> <input id="serie20151" size="1" value=50>% Chrome, <input id="serie20152" size="1" value=25>% Firefox, <input id="serie20153" size="1" value=20>% Safari, <input id="serie20154" size="1" value=5>% Outros (<i>Opera, IE, etc</i>).</p>
<p><b>2016:</b> <input id="serie20161" size="1" value=65>% Chrome, <input id="serie20162" size="1" value=20>% Firefox, <input id="serie20163" size="1" value=13>% Safari, <input id="serie20164" size="1" value=2>% Outros (<i>Opera, IE, etc</i>).</p>
<p><b>Cores:</b> <input id="cor1" size="2" value="blue"> Chrome, <input id="cor2" size="2" value="green"> Firefox, <input id="cor3" size="2" value="yellow"> Safari, <input id="cor4" size="2" value="red"> Outros (<i>Opera, IE, etc</i>).</p>
<button id="grafico">Gerar Gráfico</button>
<button id="limpa">Limpa Tela</button>
<br>
<br>
<canvas id="tela" width="350" height="400"></canvas>

<script>

    function limpaTela(){
        var tela = document.querySelector('#tela');
        var mao = tela.getContext('2d');
        mao.fillStyle = 'white';
        mao.fillRect(0, 0, 350, 400);
    }

    function coletaDados2015() {
        //Coleta os dados do periodo 2015 e armazena em vetor
        var serie2015 = [];
        var perc = 0; //Acumula valores para teste
        for (var i = 1 ; i<=4 ; i++){
            var x = '#serie2015' + [i];
            var valor = document.querySelector(x);
            serie2015[i-1] = parseInt(valor.value);
            console.log(serie2015[i-1]); //Valores individuais 2015 (teste)
            perc += parseInt(valor.value); //perc = perc + parseInt(valor.value);
        }
        console.log(perc); //resultado da soma dos valores 2015
        if (perc != 100){
            desenhaTexto(30, 170, '% <> 100'); // x(coord X) | y(coord Y) | texto(texto escrito)
            serie2015.length = 0; //Apagando toda o vetor, pois a soma dos valores > 100%
            return serie2015; //Retorna o vetor vazio
        } else {
            return serie2015; //Retorna o vetor com os valores informados
        }
    }

    function coletaDados2016() {
        //Coleta os dados do periodo 2016 e armazena em vetor
        var serie2016 = [];
        var perc = 0; //Acumula valores para teste
        for (var i = 1 ; i<=4 ; i++){
            var x = '#serie2016' + [i];
            var valor = document.querySelector(x);
            serie2016[i-1] = parseInt(valor.value);
            console.log(serie2016[i-1]); //Valores individuais 2016 (teste)
            perc += parseInt(valor.value); //perc = perc + parseInt(valor.value);
        }
        console.log(perc); //resultado da soma dos valores 2016
        if (perc!=100){
            desenhaTexto(255, 170, '% <> 100'); // x(coord X) | y(coord Y) | texto(texto escrito)
            serie2016.length = 0;  //Apagando toda o vetor, pois a soma dos valores > 100%
            return serie2016; //Retorna o vetor vazio
        } else {
            return serie2016; //Retorna o vetor com os valores informados
        }
    }

    function coletaCores() {
        //Coleta as cores para fazer o grafico
        var cores = [];
        for (var i = 1 ; i<=4 ; i++){
            var x = '#cor' + [i];
            var valor = document.querySelector(x);
            cores[i-1] = valor.value;
            console.log(cores[i-1]); //valores individuais 2016
        }
        return cores; //Retorna o vetor com as cores
    }

    function desenhaRetangulo(x, y, largura, altura, cor) {
        var tela = document.querySelector('#tela');
        var mao = tela.getContext('2d');
        mao.fillStyle = cor;
        mao.fillRect(x,y, largura, altura);
        mao.strokeStyle = 'black';
        mao.strokeRect(x,y, largura, altura);
    }

    function desenhaRetanguloVazio() {
        var tela = document.querySelector('#tela');
        var mao = tela.getContext('2d');
        //Dados 2015
        mao.fillStyle = 'white';
        mao.fillRect(0, 20, 125, 300);
        mao.strokeStyle = 'black';
        mao.strokeRect(0, 20, 125, 300);
        //Dados 2016
        mao.fillStyle = 'white';
        mao.fillRect(225, 20, 125, 300);
        mao.strokeStyle = 'black';
        mao.strokeRect(225, 20, 125, 300);
    }

    function desenhaRetangulo2015(serie2015, cores) {
        var tela = document.querySelector('#tela');
        var mao = tela.getContext('2d');
        var x = 0;
        var y = 20;
        for (var i = 0 ; i < 4 ; i++) {
            var altura = serie2015[i] * 3;
            desenhaRetangulo(x, y, 125, altura, cores[i]);
            y += altura; //y = y + altura;
        }
    }

    function desenhaRetangulo2016(serie2016, cores) {
        var tela = document.querySelector('#tela');
        var mao = tela.getContext('2d');
        var x = 225;
        var y = 20;
        for (var i = 0 ; i < 4 ; i++) {
            var altura = serie2016[i] * 3;
            desenhaRetangulo(x, y, 125, altura, cores[i]);
            y += altura; //y = y + altura;
        }
    }

    function desenhaTexto(x, y, texto) {
        var tela = document.querySelector('#tela');
        var mao = tela.getContext('2d');
        mao.font='15px Georgia'; // Tamanho e estilo da fonte
        mao.fillStyle='blue'; // cor da font
        mao.fillText(texto, x, y); // texto(texto escrito) | x(coord X) | y(coord Y)   
    }

    function geraGrafico(){
        limpaTela();
        desenhaTexto(0, 15, '2015'); // x(coord X) | y(coord Y) | texto(texto escrito)
        desenhaTexto(225, 15, '2016'); // x(coord X) | y(coord Y) | texto(texto escrito)
        retornCores = coletaCores(); //Retorno das cores
        desenhaRetanguloVazio();
        retorn2015 = coletaDados2015();
        desenhaRetangulo2015(retorn2015, retornCores);
        retorn2016 = coletaDados2016();
        desenhaRetangulo2016(retorn2016, retornCores);
    }

    var grafico = document.querySelector("#grafico");
    grafico.onclick = geraGrafico;

    var limpa = document.querySelector("#limpa");
    limpa.onclick = limpaTela;

</script>
2 respostas
solução!

Fábio, seu código ficou bem legal. Parabéns! Uma observação você poderia colocar

        var tela = document.querySelector('#tela');
        var mao = tela.getContext('2d');

no começo do seu script, aí você não ia ficar repetindo em toda função. :D

Bem observado Vânia.