# Instala os pacotes necessários
install.packages(c("ggplot2", "GetBCBData"))
Gráfico de Linha
Gráficos de linha são frequentemente usados para representar séries de tempo, isto é, valores que mudam ao longo do tempo. Estes gráficos revelam a evolução de uma variável ao longo do tempo. O ggplot
oferece alguma variedade de funções para este fim, mas a mais comum é a geom_line()
. Este geom
exige argumentos tanto para o eixo-x como para o eixo-y. Em geral, o eixo-x representa o tempo e o eixo-y o valor da variável de interesse.
Neste post vamos aprender a montar gráficos de linha usando o ggplot2
no R. Primeiro vamos fazer um exemplo simples para enxergar a dinâmica da taxa de poupança nos EUA. Depois, vamos entender como customizar o gráfico.
Além disso, vamos importar séries do Banco Central para fazer alguns exemplos aplicados usando o pacote GetBCBData
.
R
Antes de iniciar precisamos carregar o pacote ggplot2
, que traz as funções necessárias para montar os gráficos. Adicionalmente, vamos carregar o pacote GetBCBData
, que utiliza a API do Sistema Gerador de Séries Temporais (SGS) do Banco Central do Brasil para baixar séries de tempo econômicas no R
Caso os pacotes não estejam instalados é preciso executar primeiro o código abaixo.
Para carregar os pactoes utilizamos a função library
.
# Carrega o pacote ggplot2
library(ggplot2)
# Carrega o pacote GetBCBData
library(GetBCBData)
Além de servir como um repositório de funções, alguns pactoes também trazem bases de dados consigo. Neste exemplo vamos utilizar a base "economics"
do pacote ggplot2
.
data("economics")
Para consultar as bases de dados disponíveis basta utilizar o comando data()
sem nenhum argumento como no código abaixo
data()
ggplot2
O pacote ggplot2
segue uma sintaxe bastante consistente, que permite “somar” elementos visuais sobre um mesmo gráfico. Isto permite que se crie uma infinidade de gráficos complexos a partir de elementos simples. Os elementos visuais são todos chamados por funções geom_*
. Neste primeiro exemplo vamos focar na função geom_line()
que desenha linhas. Estes elementos são todos somados de maneira intuitiva usando o sinal de soma +
.
Essencialmente, temos os seguintes elementos principais:
- Dados - nossa tabela de dados.
- Função
aes()
- que transforma os dados em objetos visuais. - Objeto geométrico (
geom
) - que escolhe qual o formato destes objetos visuais.
Estes elementos são combinados numa sintaxe recorrente. A função ggplot
tipicamente tem apenas dois elementos: data
e aes
. O argumento data
indica o nome da base de dados. Já a função aes
é a que indica como transformar os dados (as colunas da base de dados) em elementos visuais. Nos casos mais simples, esta função serve para indicar qual é o nome da variável x
e qual é o nome da variável y
.
Adicionamos uma função geom
nesta chamada inicial como no exemplo abaixo.
ggplot(data = dados, aes(x = varivel_x, y = variavel_y)) +
geom_line()
Gráfico de linha
Para construir um gráfico de linha precisamos, em geral, de apenas dois arguementos: um argumento x
que é o nome da variável no eixo-x (comumemente, o tempo) e um argumento y
que é o nome da variável no eixo-y (comumemente, a variável numérica).
Vamos utilizar a base economics
que é carregada conjuntamente com o pacote ggplot2
. Esta base traz a evolução de algumas variáveis econômicas ao longo do tempo.
# Carrega a base de dados (caso ainda não tenha feito)
data("economics")
# Visualiza as primeiras linhas da base de dados
head(economics)
Note que a primeira coluna à esquerda (date
) traz as datas. A coluna psavert
é a taxa de poupança individual, mensurada em proporção à renda disponível. Podemos visualizar como se altera a taxa de poupança ao longo do tempo.
ggplot(data = economics, aes(x = date, y = psavert)) +
geom_line()
Vamos quebrar o código acima em detalhes. Primeiro, usamos a função ggplot()
para declarar que queremos fazer um gráfico. Colocamos os argumentos data
e aes
dentro desta função. O argumento data
deve ser o nome da nossa base de dados: neste caso, data = economics
.
O argumento aes
é o que transforma as variáveis (as colunas da base de dados) em elementos visuais. Neste caso ele vai transformar o tempo e a taxa de poupança em algum elemento visual. Escolhemos aes(x = date, y = psavert)
.
Especificamos qual deve ser o elemento visual somando a função geom_line()
no código inicial. Esta função indica que queremos um gráfico de linhas.
Unindo todas estes elementos temos um código enxuto que plota o gráfico. Vemos que a taxa de poupança nos EUA apresenta uma tendência de queda a partir da segunda metade dos anos 1970 que é revertida somente após a primeira metade dos anos 2000.
ggplot(
# Especifica o nome da base de dados
data = economics,
# Indica como devem ser mapeadas as variáveis nos eixos x e y
aes(x = date, y = psavert)
+
) # Especifica que queremos um gráfico de linha
geom_line()
Opções estéticas
Podemos customizar um gráfico de ggplot
modificando os seus elementos estéticos. Um elemento estético pode assumir dois tipos de valor: constante ou variável. Um valor constante é um número ou texto, enquanto uma variável é uma coluna da nossa base de dados.
Há quatro opções estéticas básicas para gráficos de linha: color
, alpha
, linewidth
e linetype
.
color
- Define a cor da linhaalpha
- Define o nível de transparência da linhalinewidth
- Define a espessura da linhalinetype
- Define o tracejado da linha
Cores
Utilizamos o argumento color
dentro da função geom_line
para variar a cor da linha no gráfico. Pode-se escolher a cor da linha tanto por nome como por código hexadecimal. Por padrão, a função geom_line
utiliza color = "black"
. No exemplo abaixo utilizo um tom de azul chamado "steelblue"
. Uma lista completa de cores (por nome) está disponível aqui.
# Gráfico de linha
ggplot(data = economics, aes(x = date, y = psavert)) +
# Altera a cor da linha
geom_line(color = "steelblue")
Também é possível chamar as cores via código hexadecimal como no exemplo abaixo.
# Gráfico de linha
ggplot(data = economics, aes(x = date, y = psavert)) +
# Altera a cor da linha
geom_line(color = "#e76f51")
Alpha
O argumento alpha
controla o nível de transparência da cor e varia de 0 a 1, em que alpha = 0
é perfeitamente transparente e alpha = 1
é nada transparente. Por padrão, a função geom_line
define que alpha = 1
. Na prática, são raros os casos em que vale alterar este argumento. No exemplo abaixo definimos alpha = 0.5
.
ggplot(data = economics, aes(x = date, y = psavert)) +
geom_line(alpha = 0.5)
Espessura da linha
O argumento linewidth
controla a espessura da linha. No exemplo abaixo defino linewidth = 1
dentro da função geom_line()
. Na prática, não recomendo escolher um valor de linewidth
acima de 1 pois a linha se torna muito espessa.
ggplot(data = economics, aes(x = date, y = psavert)) +
geom_line(linewidth = 1)
O gráfico abaixo compara alguns tamanhos diferentes de espessura de linha. Note que é possível especificar valores não-inteiros como 0,5. Para evitar de repetir o mesmo código várias vezes, guardo a chamada inicial do ggplot
em um objeto chamado p
(de plot).
<- ggplot(data = economics, aes(x = date, y = psavert))
p
# Espessura = 0.5
+ geom_line(linewidth = 0.5)
p # Espessura = 1
+ geom_line(linewidth = 1)
p # Espessura = 2
+ geom_line(linewith = 2)
p # Espessura = 5
+ geom_line(linewidth = 5) p
Tracejado da linha
O argumento linetype
controla o tracejado da linha. Por padrão, a função geom_line()
utiliza linetype = 1
, mas podemos escolher valores distintos. No exemplo abaixo usamos linetype = 2
.
ggplot(data = economics, aes(x = date, y = psavert)) +
geom_line(linetype = 2)
Abaixo pode-se ver a diferença entre cada uma delas.
Combinando elementos
Como foi aludido no início do post, parte da mágica do ggplot
é de poder somar elementos ao mesmo gráfico. Isto permite uma grande flexibilidade na hora de montar nossas visualizações. Uma combinação bastante efetiva é juntar um gráfico de linha com um gráfico de pontos.
Primeiro, vamos importar a série do consumo de energia elétrica residencial no Brasil. Podemos importar séries de tempo do site do Banco Central do Brasil usando a função gbcbd_get_series
do pacote GetBCBData
.
Para importar uma série de tempo precisamos informar apenas: (1) o código da série pelo argumento id
; e (2) a data de início da extração pelo argumento first.date
(no formato YYYY-MM-DD).
# Import a série de consumo de energia elétrica residencial
<- gbcbd_get_series(id = 1403, first.date = as.Date("2014-01-01")) consumo
O gráfico abaixo combina um geom_line()
com um geom_point()
para representar tanto os pontos de observação como a linha que une os pontos.
ggplot(data = consumo, aes(x = ref.date, y = value)) +
# Linha da série
geom_line() +
# Pontos sinalizando as observações
geom_point()
Mapeando elementos estéticos
Cores
Como de costume, as características estéticas do gráfico podem refletir grupos de variáveis. No caso de gráficos de linha é comum querer representar séries de tempo distintas com cores diferentes.
Vamos importar três séries de tempo: o consumo de energia elétrica comercial (1402), residencial (1403) e industrial (1404). Todas as séries são mensais e são importadas a partir de janeiro de 2014.
# Importa as séries mensais do consumo de energia elétrica
<- gbcbd_get_series(
series id = c(1402, 1403, 1404),
first.date = as.Date("2014-01-01")
)
Os dados são automaticamente formatados no padrão longitudinal, em que cada linha representa uma observação no tempo de uma série em particular. Este é o formato ideal para trabalhar com visualizações em ggplot
, onde os dados estão “empilhados”.
A coluna ref.date
indica a data, a coluna series.name
identifica o id da série e a coluna value
representa o valor desta observação.
Vamos mapear a coluna series.name
nas cores das linhas. Para especificar isto utilizamos a função aes
, que serve para transformar dados em elementos visuais. Da mesma forma como mapeamos a coluna ref.date
e value
numa linha, agora mapeamos series.name
nas cores do gráfico.
ggplot(data = series, aes(x = ref.date, y = value)) +
geom_line(
# Indica que a variável series.name deve ser mapeada nas cores das linhas
aes(color = series.name)
)
As escolhas de cores padrão nem sempre são satisfatórias. Para modificar as cores utilizamos a função scale_color_manual()
que também nos dá controle sobre a legenda do gráfico.
ggplot(data = series, aes(x = ref.date, y = value)) +
geom_line(aes(color = series.name)) +
# Controla as cores e a legenda
scale_color_manual(
# Título da legenda (opcional)
name = "Consumo de energia",
# Nome das séries (opcional)
labels = c("Comercial", "Residencial", "Industrial"),
# Cores das linhas
values = c("#264653", "#e9c46a", "#e76f51"),
)
Vale notar que existem vários pacotes e funções com cores pré-definidas que simplificam o processo manual de escolher as cores. O exemplo mais simples é o scale_color_brewer()
que utiliza as paletas de cores do Color Brewer.
ggplot(data = series, aes(x = ref.date, y = value)) +
geom_line(aes(color = series.name)) +
# Controla as cores e a legenda
scale_color_brewer(
# Título da legenda (opcional)
name = "Consumo de energia",
# Nome das séries (opcional)
labels = c("Comercial", "Residencial", "Industrial"),
# Tipo ("qual" - qualitativo, "div" - divergente ou "seq" - sequencial)
type = "qual",
# Escolha da paleta
palette = 6
)
Por padrão, a legenda das cores é colocada no lado direito do gráfico. Para modificar a sua posição usamos a função theme()
.
ggplot(data = series, aes(x = ref.date, y = value)) +
geom_line(aes(color = series.name)) +
scale_color_brewer(
name = "Consumo de energia",
labels = c("Comercial", "Residencial", "Industrial"),
type = "qual",
palette = 6
+
) theme(
# Define a posição da legenda (top, bottom, right ou left)
legend.position = "bottom"
)
Tipo de linha
Da mesma forma que modificamos a cor das linhas, podemos variar outros aspectos estéticos como, por exemplo, o tracejado da linha de cada série. Este tipo de modificação pode ser útil no caso de uma publicação que vai ser visualizada ou impressa em escala de cinza.
ggplot(data = series, aes(x = ref.date, y = value)) +
geom_line(
# Cada série é desenhada com um tracejado diferente
aes(linetype = series.name)
+
) # Controla a legenda das séries
scale_linetype_discrete(
# Título da legenda (opcional)
name = "Consumo de energia",
# Nome das séries (opcional)
labels = c("Comercial", "Residencial", "Industrial")
)
Por fim, podemos modificar elementos estéticos de dois geoms
no mesmo gráfico. No exemplo abaixo tanto o tracejado da linha como o formato do ponto variam segundo a série.
ggplot(data = series, aes(x = ref.date, y = value)) +
geom_line(aes(linetype = series.name)) +
geom_point(aes(shape = series.name)) +
# Controla a legenda das séries
scale_linetype_discrete(
# Título da legenda (opcional)
name = "Consumo de energia",
# Nome das séries (opcional)
labels = c("Comercial", "Residencial", "Industrial")
+
) scale_shape_discrete(
# Título da legenda (opcional)
name = "Consumo de energia",
# Nome das séries (opcional)
labels = c("Comercial", "Residencial", "Industrial")
)
Renomeando os eixos do gráfico
É muito importante que um gráfico seja o mais auto-explicativo possível. Para isso precisamos inserir informações relevantes como título, subtítulo e fonte.
A função labs()
permite facilmente renomear os eixos do gráfico. Os argumentos principais são os abaixo.
title
- título do gráficosubtitle
- subtítulo do gráficox
- título do eixo-x (horizontal)y
- título do eixo-y (vertical)caption
- legenda abaixo do gráfico (em geral, a fonte)
No caso de gráficos de linha é muito comum omitir o nome do eixo-x, pois ele geralmente representa o tempo. Para omitir o nome de qualquer eixo basta defini-lo como NULL
.
Novamente, utilizamos o sinal de soma para adicionar estes elementos ao gráfico.
ggplot(data = consumo, aes(x = ref.date, y = value)) +
# Linha da série
geom_line() +
# Define os elementos textuais do gráfico
labs(
title = "Aumento gradual na demanda por energia elétrica",
subtitle = "Consumo residencial de energia elétrica no Brasil.",
# Omite o título do eixo-x
x = NULL,
y = "GWh",
caption = "Fonte: Eletrobras."
)
Começando o gráfico do zero
Os gráficos de linha gerados pelo ggplot2
não começam do zero no eixo-y. Isto pode ser um problema e, visualmente, criar a ilusão de que há mais volatilidade nos dados do que realmente existe.
Há muitas formas de forçar o gráfico a iniciar no zero. Uma das mais efetivas é incluir uma linha horizontal no eixo (\(y = 0\)). Pode-se desenhar esta linha horizontal com a função geom_hline()
(onde o “hline” sinaliza “horizontal line”, linha horizontal).
ggplot(data = consumo, aes(x = ref.date, y = value)) +
# Linha horizontal y = 0
geom_hline(yintercept = 0) +
# Linha da série
geom_line()
Outra forma de chegar no mesmo resultado é manipular o eixo-y para forçá-lo a iniciar no zero. No exemplo abaixo utilizamos a função scale_y_continuous()
. Esta função controla todos os aspectos visuais da escala no eixo-y. O sufixo _continuous
indica que a variável no eixo-y é contínua.
Para redefinir os limites do eixo-y variamos o argumento limits
que aceita um par de valores. O primeiro valor é o limite inferior e o segundo valor é o limite superior. Por padrão ambos são definidos como NA
.
ggplot(data = consumo, aes(x = ref.date, y = value)) +
# Linha da série
geom_line() +
# Manipular o eixo-y para inicar no zero
scale_y_continuous(limits = c(0, NA))
Séries de tempo em degraus
Algumas séries de tempo variam de maneira “descontínua” no tempo. É o caso, por exemplo, da taxa SELIC, que é periodicamente definida como uma meta a ser perseguida pelo Banco Central. Neste caso, faz sentido ressaltar isto fazendo um gráfico que varia em “degraus”.
A função geom_step()
faz este tipo de gráfico e possui os mesmos argumentos que a função geom_line()
. O gráfico abaixo mostra a variação da taxa SELIC (meta) nos últimos anos.
# Importa a série diária da SELIC (meta) anualizada
<- gbcbd_get_series(id = 1178, first.date = as.Date("2016-01-01"))
selic
ggplot(data = selic, aes(x = ref.date, y = value)) +
geom_step()
Resumo
Neste post aprendemos o básico da estrutura sintática do ggplot
e conseguimos montar gráficos de linha sofisticados usando poucas linhas de código. Em qualquer gráfico temos três elementos básicos
- Dados - nossa tabela de dados.
- Função
aes()
- que transforma os dados em objetos visuais. - Objeto geométrico (
geom
) - que escolhe qual o formato destes objetos visuais.
Alguns pontos de destaque:
- Utilize cores diferentes para séries distintas usando
aes(color = ...)
. - Combine elementos como linhas e pontos somando os “geoms”.
- Comece o gráfico no zero utilizando ou
geom_hline(yintercept = 0)
ouscale_y_continuous(limits=c(0,NA))
.
Seguindo esta lógica e somando os objetos podemos criar belos gráficos.
# Importa as séries mensais do consumo de energia elétrica
<- gbcbd_get_series(
series id = c(1402, 1403, 1404),
first.date = as.Date("2019-01-01")
)
ggplot(data = series, aes(x = ref.date, y = value)) +
geom_hline(yintercept = 0) +
geom_line(
aes(color = series.name),
linewidth = 1
+
) geom_point(
aes(color = series.name),
size = 2
+
) scale_color_manual(
name = "Consumo de Energia",
labels = c("Comercial", "Residencial", "Industrial"),
values = c("#264653", "#e9c46a", "#e76f51")
+
) labs(
title = "Recuperação do consumo de energia pós-pandemia",
subtitle = "Consumo mensal de energia elétrica segundo a finalidade.",
x = NULL,
y = "(GWh)",
caption = "Fonte: Eletrobras."
+
) theme(
legend.position = "bottom"
)