Em um tutorial anterior, abordamos como desenhar um gráfico de pizza ou um gráfico de rosca usando a tela HTML5. Neste tutorial, mostrarei como usar JavaScript e a tela HTML5 como meio de exibir dados graficamente usando gráficos de barras.
Existem maneiras mais fáceis de criar gráficos do que codificar um do zero, por exemplo, esta biblioteca de gráficos completa do CodeCanyon.
Mas se você quer saber o que é preciso para criar uma biblioteca como essa, este tutorial é para você.
O que é um gráfico de barras?
Os gráficos de barras são ferramentas muito comuns usadas para representar dados numéricos. De relatórios financeiros a apresentações em PowerPoint e infográficos, os gráficos de barras são usados com muita frequência, pois oferecem uma visualização de dados numéricos muito fácil de entender.
Os gráficos de barras representam dados numéricos usando barras, que são retângulos com larguras ou alturas proporcionais aos dados numéricos que representam.
Existem muitos tipos de gráficos de barras:
- gráficos de barras horizontais e gráficos de barras verticais dependendo da orientação do gráfico
- gráficos de barras empilhadas ou gráficos de barras clássicos para representar várias séries de dados
- gráficos de barras 2D ou 3D
- etc.
Quais são os componentes de um gráfico de barras?
Vamos dar uma olhada nos componentes que compõem um gráfico de barras, independentemente de seu tipo:
- Os dados do gráfico: são conjuntos de números e categorias associadas que são representadas pelo gráfico.
- Nome da série de dados (1).
- A grade do gráfico (2): fornece um sistema de referência para que a representação visual possa ser facilmente compreendida.
- As barras (3): retângulos coloridos com dimensões proporcionais aos dados representados.
- Legenda do gráfico (4): mostra a correspondência entre as cores utilizadas e os dados que elas representam.
Agora que conhecemos os componentes de um gráfico de barras, vamos ver como podemos escrever o código JavaScript para desenhar um gráfico como este.
Desenhando o gráfico de barras usando JavaScript
Configurando o projeto JS
Para começar a desenhar usando JavaScript e a tela HTML5, precisaremos configurar nosso projeto assim:
- Crie uma pasta para guardar os arquivos do projeto; vamos chamar esta pasta
bar-chart-tutorial
. - Dentro da pasta do projeto, crie um arquivo e chame-o
index.html
. Isso conterá nosso código HTML. - Também dentro da pasta do projeto, crie um arquivo e chame-o
script.js
. Isso conterá o código JavaScript para desenhar o gráfico de barras.
Vamos manter as coisas muito simples e adicionar o seguinte código dentro index.html
:
Nós temos o elemento com o ID
myCanvas
para que possamos referenciá-lo em nosso código JS. Em seguida, carregamos o código JS através do tag.
Add the following code in the
script.js
file:
var myCanvas = document.getElementById("myCanvas"); myCanvas.width = 300; myCanvas.height = 300; var ctx = myCanvas.getContext("2d");This gets a reference to the canvas element and then sets the width and height to
300px
. To draw on the canvas, we only need a reference to its 2D context, which contains all the drawing methods.
Adding a Few Helper Functions
Drawing the bar chart only requires knowing how to draw two elements:- drawing a line: for drawing the grid lines
- drawing a color-filled rectangle: for drawing the bars of the chart
script.js
file.
function drawLine(ctx, startX, startY, endX, endY,color){ ctx.save(); ctx.strokeStyle = color; ctx.beginPath(); ctx.moveTo(startX,startY); ctx.lineTo(endX,endY); ctx.stroke(); ctx.restore(); }The
drawLine
function takes six parameters:
-
ctx
: reference to the drawing context -
startX
: the X coordinate of the line starting point -
startY
: the Y coordinate of the line starting point -
endX
: the X coordinate of the line end point -
endY
: the Y coordinate of the line end point -
color
: the color of the line
strokeStyle
. This determines the color used to draw the line. We use ctx.save()
and ctx.restore()
so that we don't affect the colors used outside this function.
We draw the line by calling beginPath()
. This informs the drawing context that we are starting to draw something new on the canvas. We use moveTo()
to set the starting point, call lineTo()
to indicate the end point, and then do the actual drawing by calling stroke()
.
Another helper function that we need is a function to draw a bar—which is a color-filled rectangle. Let's add it to script.js
:
function drawBar(ctx, upperLeftCornerX, upperLeftCornerY, width, height,color){ ctx.save(); ctx.fillStyle=color; ctx.fillRect(upperLeftCornerX,upperLeftCornerY,width,height); ctx.restore(); }The
drawBar
function takes six parameters:
-
ctx
: reference to the drawing context -
upperLeftCornerX
: the X coordinate of the bar's upper left corner -
upperLeftCornerY
: the X coordinate of the bar's upper left corner -
width
: the width of the bar -
height
: the height of the bar -
color
: the color of the bar
The Bar Chart Data Model
Now that we have the helper functions in place, let's move on to the chart's data model. All types of chart, including bar charts, have a data model behind them. The data model is a structured set of numerical data. For this tutorial we will use a data series of categories and their associated numerical values representing the number of vinyl records in my collection of records grouped by music genre:- Classical music: 10
- Alternative rock: 14
- Pop: 2
- Jazz: 12
script.js
file:
var myVinyls = { "Classical music": 10, "Alternative rock": 14, "Pop": 2, "Jazz": 12 };
Implementing the Bar Chart Component
Let's implement the component that will do the actual drawing of our bar chart. We will do this by adding the following JavaScript object to ourscript.js
file:
var Barchart = function(options){ this.options = options; this.canvas = options.canvas; this.ctx = this.canvas.getContext("2d"); this.colors = options.colors; this.draw = function(){ var maxValue = 0; for (var categ in this.options.data){ maxValue = Math.max(maxValue,this.options.data[categ]); } var canvasActualHeight = this.canvas.height - this.options.padding * 2; var canvasActualWidth = this.canvas.width - this.options.padding * 2; //drawing the grid lines var gridValue = 0; while (gridValue <= maxValue){ var gridY = canvasActualHeight * (1 - gridValue/maxValue) + this.options.padding; drawLine( this.ctx, 0, gridY, this.canvas.width, gridY, this.options.gridColor ); //writing grid markers this.ctx.save(); this.ctx.fillStyle = this.options.gridColor; this.ctx.font = "bold 10px Arial"; this.ctx.fillText(gridValue, 10,gridY - 2); this.ctx.restore(); gridValue+=this.options.gridScale; } //drawing the bars var barIndex = 0; var numberOfBars = Object.keys(this.options.data).length; var barSize = (canvasActualWidth)/numberOfBars; for (categ in this.options.data){ var val = this.options.data[categ]; var barHeight = Math.round( canvasActualHeight * val/maxValue) ; drawBar( this.ctx, this.options.padding + barIndex * barSize, this.canvas.height - barHeight - this.options.padding, barSize, barHeight, this.colors[barIndex%this.colors.length] ); barIndex++; } } }The class starts by storing the
options
passed as parameters. It stores the canvas
reference and creates a drawing context also stored as a class member. Then it stores the colors
array passed as options.
The next part is the most consistent, the draw()
function. This will draw the chart by first drawing the grid lines, the grid markers and then the bars using the parameters passed via the options
object.
Looking at the draw()
function, we can see that first we calculate the maximum value for our data model. We need this number because we will need to scale all the bars according to this value and according to the size of the canvas. Otherwise, our bars might go outside the display area, and we don't want that.
The canvasActualHeight
and canvasActualWidth
variables store the height and width of the canvas adjusted using the value of the padding passed via options
. The padding
variable indicates the number of pixels between the edge of the canvas and the chart inside.
We then draw the grid lines of the chart. The options.gridScale
variable sets the step used for drawing the lines. So a gridScale
of 10 will mean drawing grid lines every 10 units.
To draw the grid lines, we use the helper function drawLine()
; as for the color of the grid lines, we take it from the options.gridColor
variable. Please note that the canvas coordinates start from 0,0
in the top left corner and increase towards the right and bottom, while our grid values increase in value from the bottom towards the top. That is why we used 1 - gridValue/maxValue
in the formula calculating the gridY
value.
For every grid line, we also draw the value of the grid line 2 pixels above the grid line (that's why we have gridY - 2
for the Y coordinates of the text).
Next we draw the bars by using the helper function drawBar()
. The math for calculating the height and width of each bar is pretty straightforward; it takes into account the padding and the value and color for each category in the chart's data model.
Using the Bar Chart Component
Let's now see how to use theBarchart
class implemented above. We need to instantiate the class and call the draw()
function. Add the following code to the script.js
file:
var myBarchart = new Barchart( { canvas:myCanvas, padding:10, gridScale:5, gridColor:"#eeeeee", data:myVinyls, colors:["#a55ca5","#67b6c7", "#bccd7a","#eb9743"] } ); myBarchart.draw();The code creates a new instance of the
Barchart
class with the required options. Loading the index.html
in a browser should produce a result like this:
Adicionando o nome da série de dados e a legenda do gráfico
Para adicionar o nome da série de dados abaixo do gráfico, precisamos adicionar o seguinte código noscript.js
arquivo após o for-loop
que desenha a barra:
... //drawing series name this.ctx.save(); this.ctx.textBaseline="bottom"; this.ctx.textAlign="center"; this.ctx.fillStyle = "#000000"; this.ctx.font = "bold 14px Arial"; this.ctx.fillText(this.options.seriesName, this.canvas.width/2,this.canvas.height); this.ctx.restore(); ...Também precisamos mudar a forma como chamamos o
Barchart
componente assim:
var myBarchart = new Barchart( { canvas:myCanvas, seriesName:"Vinyl records", padding:20, gridScale:5, gridColor:"#eeeeee", data:myVinyls, colors:["#a55ca5","#67b6c7", "#bccd7a","#eb9743"] } ); myBarchart.draw();E aqui está como fica o resultado: Para adicionar a legenda, primeiro precisamos modificar
index.html
para ficar assim:
o legend
será usada como um espaço reservado para a legenda do gráfico. o for
O atributo liga a legenda à tela que contém o gráfico. Agora precisamos adicionar o código que cria a legenda. Faremos isso no index.js
arquivo após o código que desenha o nome da série de dados. O código identifica o legend
tag correspondente ao gráfico e adicionará a lista de categorias do modelo de dados do gráfico junto com a cor correspondente. O resultado index.js
arquivo ficará assim:
var myCanvas = document.getElementById("myCanvas"); myCanvas.width = 300; myCanvas.height = 300; var ctx = myCanvas.getContext("2d"); function drawLine(ctx, startX, startY, endX, endY,color){ ctx.save(); ctx.strokeStyle = color; ctx.beginPath(); ctx.moveTo(startX,startY); ctx.lineTo(endX,endY); ctx.stroke(); ctx.restore(); } function drawBar(ctx, upperLeftCornerX, upperLeftCornerY, width, height,color){ ctx.save(); ctx.fillStyle=color; ctx.fillRect(upperLeftCornerX,upperLeftCornerY,width,height); ctx.restore(); } var myVinyls = { "Classical music": 10, "Alternative rock": 14, "Pop": 2, "Jazz": 12 }; var Barchart = function(options){ this.options = options; this.canvas = options.canvas; this.ctx = this.canvas.getContext("2d"); this.colors = options.colors; this.draw = function(){ var maxValue = 0; for (var categ in this.options.data){ maxValue = Math.max(maxValue,this.options.data[categ]); } var canvasActualHeight = this.canvas.height - this.options.padding * 2; var canvasActualWidth = this.canvas.width - this.options.padding * 2; //drawing the grid lines var gridValue = 0; while (gridValue <= maxValue){ var gridY = canvasActualHeight * (1 - gridValue/maxValue) + this.options.padding; drawLine( this.ctx, 0, gridY, this.canvas.width, gridY, this.options.gridColor ); //writing grid markers this.ctx.save(); this.ctx.fillStyle = this.options.gridColor; this.ctx.textBaseline="bottom"; this.ctx.font = "bold 10px Arial"; this.ctx.fillText(gridValue, 10,gridY - 2); this.ctx.restore(); gridValue+=this.options.gridScale; } //drawing the bars var barIndex = 0; var numberOfBars = Object.keys(this.options.data).length; var barSize = (canvasActualWidth)/numberOfBars; for (categ in this.options.data){ var val = this.options.data[categ]; var barHeight = Math.round( canvasActualHeight * val/maxValue) ; drawBar( this.ctx, this.options.padding + barIndex * barSize, this.canvas.height - barHeight - this.options.padding, barSize, barHeight, this.colors[barIndex%this.colors.length] ); barIndex++; } //drawing series name this.ctx.save(); this.ctx.textBaseline="bottom"; this.ctx.textAlign="center"; this.ctx.fillStyle = "#000000"; this.ctx.font = "bold 14px Arial"; this.ctx.fillText(this.options.seriesName, this.canvas.width/2,this.canvas.height); this.ctx.restore(); //draw legend barIndex = 0; var legend = document.querySelector("legend[for="myCanvas"]"); var ul = document.createElement("ul"); legend.append(ul); for (categ in this.options.data){ var li = document.createElement("li"); li.style.listStyle = "none"; li.style.borderLeft = "20px solid "+this.colors[barIndex%this.colors.length]; li.style.padding = "5px"; li.textContent = categ; ul.append(li); barIndex++; } } } var myBarchart = new Barchart( { canvas:myCanvas, seriesName:"Vinyl records", padding:20, gridScale:5, gridColor:"#eeeeee", data:myVinyls, colors:["#a55ca5","#67b6c7", "#bccd7a","#eb9743"] } );
Que produzirá um resultado final parecido com este:
Parabéns
Vimos que desenhar gráficos usando a tela HTML5 não é tão difícil. Requer apenas um pouco de matemática e um pouco de conhecimento de JavaScript. Agora você tem tudo o que precisa para desenhar seus próprios gráficos de barras.
Se você deseja uma solução rápida e fácil para criar não apenas gráficos de barras, mas muitos outros tipos de gráficos, você pode baixar a Biblioteca de Tags HTML de Gráficos e Gráficos Infográficos ou sua contraparte do plugin WordPress Gráficos e Gráficos WordPress Visual Designer.
Originally posted 2022-07-11 15:22:23.