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

Grafico de barras

Confesso que tive uma certa dificuldade na manutenibilidade, pois não tinha enxergado de cara como toda operação tinha sido quebrada em várias funções, tendo de refazer muita coisa e dar uma estudade como o instrutor fez para entender a estruturação.

Segue o HTML

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="grafico.css">
    <title>Grafico de barras</title>
</head>
<body>
    <canvas id="barras" width="600px" height="400px"></canvas>
    <div id="browser"></div>
    <script src="grafico.js"></script>
</body>
</html>

Segue o CSS

li{
    display:inline;
    font: 20px bold;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
}

#texto{
    margin: 0px;
    padding: 0px;
    font: 14px bolder;
    text-align: center;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
}
#browser{
    background-color:lightgray;
    position: absolute;
    top: 150px;
    left: 20px;
}

#Chrome{
    color: blue;
}

#Firefox{
    color: green;
}

#Safari{
    color: yellow;
}

#Outros{
    color: red;
}

Segue o Javascript

const nav2015 = [50,25,20,5];
const nav2016 = [65,20,13,2];
const colors = ["blue","green","yellow","red"];
const browsers = ["Chrome","Firefox","Safari","Outros"];
const conteudo = document.querySelector("#browser");

function drawRect(x,y,width,height,colors){
    const tela = document.querySelector("#barras");
    const pincel = tela.getContext("2d");
    pincel.fillStyle=colors;
    pincel.fillRect(x,y,width,height);
    pincel.strokeRect(x,y,width,height);
}

function drawText(x,y,text){
    const tela = document.querySelector("#barras");
    const pincel = tela.getContext("2d");
    pincel.fillStyle="black";
    pincel.font="14px Verdana";
    pincel.font.weight="bold";
    pincel.fillText(text,x,y);
}

function drawTextBrowser(x,y,text){
    const tela = document.querySelector("#barras");
    const pincel = tela.getContext("2d");
    pincel.fillStyle="black";
    pincel.font="14px Verdana";
    pincel.font.weight="bold";
    pincel.fillText(text,x,y);
}

function drawBrowsers(browsers){
    conteudo.innerHTML=`<p id="texto"><ul>`;
    for(let f=0;f<browsers.length;f++){
        conteudo.innerHTML+=`<li id="${browsers[f]}">${browsers[f]}   </li>`;
    }
    conteudo.innerHTML+=`</p></ul>`;
}

function drawGraph(x,y,graphic,colors,browsers,text){
    drawText(x+5,y-5,text);
    drawBrowsers(browsers);
    let sumHeight=0;

    for(let i=0;i<graphic.length;i++){
        let height = graphic[i];
        drawRect(x,y+sumHeight,50,height,colors[i]);
        drawTextBrowser(x+60,y+sumHeight+7,browsers[i]);
        sumHeight+=height;
    }
}

drawGraph(80,20,nav2015,colors,browsers,"2015");
drawGraph(230,20,nav2016,colors,browsers,"2016");

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Obs:. Uma coisa que fiquei gastando horas quebrando a cabeça mas infelizmente não consegui arrumar foi o posicionamento no meio de cada barra com o navegador, não consegui visualizar uma forma de fazer com que no FOR pudesse acertar a posição do nome do browser exatamente no meio de cada barra colorida.

3 respostas

Oi Alysson!

Que legal seu código, parabéns, ficou muito pró! Eu tb quebrei a cabeça horas pensando em como colocar os nomes nos navegadores no alinhado com o meio de cada barra, mas no fim consegui. Dá uma olhada na função desenhaNavegadores() e vê se é útil pra você em alguma coisa.

<canvas width="600" height="400"></canvas> 

<script>
    var tela = document.querySelector("canvas");
    var pincel = tela.getContext("2d");
    var serie2015 = [50, 25, 20, 5];
    var serie2016 = [65, 20, 13, 2];
    var serie2022 = [75, 10, 10, 5]
    var cores = ['blue', 'green', 'yellow', 'red'];
    var navegadores = ["Chrome", "Firefox", "Safari", "Outros"]

    pincel.fillStyle = "lightblue";
    pincel.fillRect(0, 0, 600, 400)

    function desenhaRetangulo(cor, x, y, l, h) {

        pincel.fillStyle = cor;
        pincel.fillRect(x, y, l, h);
        pincel.strokeStyle = "black";
        pincel.strokeRect(x, y, l, h); 
    }

    function desenhaTexto(texto, x, y) {

        pincel.font = "13px Tahoma";
        pincel.fillStyle = "black"
        pincel.textBaseline ="middle"
        pincel.strokeText(texto, x, y);
        pincel.fillText(texto, x, y);  
    }

    function desenhaBarra(cores, series, texto, x, y) {

        desenhaTexto(texto, x,  y - 10);

        for(var i = 0; i < series.length; i++) {

            series[i] = series[i] * 2; //aqui eu dobrei o valor de cada retangulo, pra poder aplicar o texto depois, sem comprimí-lo.

            desenhaRetangulo(cores[i], x, y, 50, series[i])

            y = y + series[i];

        }

    }

    function desenhaNavegadores(texto, x, series) {

        y = 150; //valor inicial de y na fução desenhaBarra

            for(var i = 0; i < series.length; i++) { 

               desenhaTexto(texto[i], x -50, y + (series[i] / 2)) //alguns ajustes pra alinhar os nomes, aqui pegue eixo y e somei com a metade do valor de cada item do array "serie****"

                y = y + series[i];                               

            }

    }

    desenhaBarra(cores, serie2015, "2015", 100, 150);

    desenhaBarra(cores, serie2016, "2016",  250, 150)

    desenhaBarra(cores, serie2022, "2022",  400, 150)

    desenhaNavegadores(navegadores, 100, serie2015);    

    desenhaNavegadores(navegadores, 250, serie2016);

    desenhaNavegadores(navegadores, 400, serie2022);

</script>

gráficos

solução!

Esse último gráfico criei pra testar se todas as funções estavam funcionando corretamente, o valores são fictícios. Pensando em implementar uma função pra criar legendas tb haha.

Espero que te ajude em algo!

Opa ítalo, blz? Valeu colega, pois é eu tinha começado a pensar nisto que você implementou mas acredito que eu fiz salada depois querendo fazer tudo dentro de 1 lugar só e acabei apagando kkkkk.

Irei testar aqui separando, ficou maneiro :D