Introdução ao ggplot2
(Originalmente publicado no OpenCodeCom, doi: 10.17632/4jmxk67rrn.1)
Nesse post iremos ensinar algumas funções do pacote ggplot2 para a elaboração de gráficos. Esse post tem a intenção de ser introdutório, para aqueles que estão começando no R ou nos gráficos no R.
Iremos utilizar a base de dados gapminder, disponível no pacote de mesmo nome, para realizar nossas análises.
Um material de consulta muito útil é a Cheat Sheet disponibilizada pelo próprio RStudio.
Dividimos o post em tipos de dados e dentro dessa divisão falamos sobre seus gráficos mais usados. Toda seção começa com gráficos mais básicos e avança para estéticas mais elaboradas.
Caso tenha dificuldade em entender alguma manipulação de dados você pode consultar nosso post anterior sobre o pacote dplyr.
Uma pequena introdução à Grammar of Graphics
Os gráficos em ggplot2 são construídos em camadas.
Para fazer um gráfico em ggplot2, precisamos informar ao R 3 elementos essenciais do gráfico a ser construído: os dados a serem usados, o mapeamento das variáveis (para x e y, e outros parâmetros como cor, tamanho etc.) e a geometria do gráfico (linha, pontos, barra, histograma etc.).
Podemos ter como exemplo um simples esquema:
ggplot(<dados-utilizados>,
aes(x = <variável-mapeada-para-x>,
y = <variável-mapeada-para-y>,
color = <variável-mapeada-para-cor>)) +
geom_<tipo-de-gráfico>()
No esquema acima, temos todos os elementos para criar um gráfico que, embora não seja estéticamente agradável, é funcional. Todos os elementos gráficos ggplot2 devem possuir dados, mapeamento de variáveis e geometria.
Além disso, há algumas camadas opcionais para os gráficos. Podemos citar a camada facets, que subdivide os dados - e os gráficos - com base em cada valor de algum parâmetro, gerando gráficos múltiplos; estatísticas (usa-se o elemento: stat_<estatística-desejada>), que adiciona elementos como média, mediana e linhas de regressão; coordenadas, que nos permite manipular os eixos do gráfico (como colocá-los em escala logarítmica etc.); temas, por meio dos quais mudamos de forma rápida a aparência do gráfico.
Dito isso, diversas das camadas opcionais serão utilizadas nos exemplos elaborados dos gráficos. Elas podem ser exploradas mais profundamente nesse ótimo guia de ggplot2 da STHDA. Não fizemos uma abordagem tão profunda nesse post devido ao seu caráter introdutório.
Mãos na massa
Agora podemos importar as bibliotecas necessárias.
library(dplyr) # Utilizado para fazer a manipulação dos dados.
library(ggplot2) # Utilizado para construir os gráficos.
library(gapminder) # Utilizado como fonte de dados socioeconômicos.
Primeiro vemos como é o dataframe que iremos trabalhar utlizando a função View().
View(gapminder)
Gráficos de uma variável
Histograma
Agora que sabemos com que dados estamos lidando, podemos começar a nossa análise. Para esse gráfico univariado usaremos o dado de população no ano de 1952.
# Primeiro vamos manipular no nosso dataframe para termos os dados que queremos
gapminder_1952 <- gapminder %>%
filter(year == 1952)
# Agora podemos criar um histograma para a Expectativa de Vida (lifeExp)
ggplot(gapminder_1952, aes(x = lifeExp)) +
geom_histogram(bins = 20) # Bins indica o número de intervalos a serem utilizados no eixo x
# Vale ressaltar que poderiamos fazer um histograma também com outros dados, tais como população, etc.
Esse gráfico é o tipo mais básico do histograma, onde passamos a nossa fonte de dados(gapminder_1952) e qual dado dessa fonte usaremos.
Um gráfico mais elaborado, bem como seus novos parâmetros pode ser obtido assim:
ggplot(gapminder, aes(x = lifeExp)) +
geom_histogram(bins = 20) + # Bins indica o número de intervalos a serem utilizados no eixo x
labs(x = 'Expectativa de Vida', # Muda o título do eixo x
y = 'Frequência', # Muda o título do eixo y
title = 'Expectativa de Vida', # Muda o título do gráfico
caption = "Fonte: Gapminder.") + # Muda a legenda
theme_light() + # Indica o tema a ser usado no gráfico
facet_wrap(~ year) # Indica que o gráfico será dividido ano a ano
Além disso, podemos fazer um histograma para continente para cada ano, podendo ver melhor a evolução da expectativa de vida de cada um. Faremos isso utilizando o facet_grid(), em que podemos separar colunas e linhas por variáveis distintas. Nesse caso as linhas serão os anos e as colunas serão os continentes.
Algo a ser ressaltado é que não usaremos todos os anos disponíveis na base de dados (12 anos), mas apenas 6. Isso ajudará na visualização dos gráficos (selecionaremos os anos de 2007, 1997, 1987, 1977, 1967 e 1957).
ggplot(subset(gapminder, year %in% c(2007, 1997, 1987, 1977, 1967, 1957)), aes(x = lifeExp)) +
geom_histogram(bins = 20) +
labs(x = 'Expectativa de Vida', # Muda o título do eixo x
y = 'Frequência', # Muda o título do eixo y
title = 'Expectativa de Vida', # Muda o título do gráfico
caption = "Fonte: Gapminder.") + # Muda a legenda
theme_light() + # Indica o tema a ser usado no gráfico
facet_grid(year ~ continent)
Gráfico de barras
O Gráfico de barras é similar à um histograma em seu formato, porém, esse gráfico é usado para identificar quantas observações pertencem à determinada classe, ao invés de um determinado intervalo de valores, como no histograma.
Nesse caso, iremos ver quantos países de cada continente possuímos no nosso dataframe, no ano de 1952. Esse tipo de gráfico de barras, em que o próprio ggplot conta os valores pertencentes à cada classe é o geom_bar().
ggplot(gapminder_1952, aes(x = continent)) +
geom_bar()
E agora uma versão mais polida:
ggplot(gapminder_1952, aes(x = continent)) +
labs(x = 'Continente', # Muda o título do eixo x
y = 'Número de países') + # Muda o título do eixo y
title = 'Países por continente', # Muda o título do gráfico
theme_light() + # Muda o tema do gráfico
geom_bar()
Gráficos de duas variáveis
Gráfico de Dispersão/Pontos
Gráficos de dispersão são muito usados para indicar a relação entre duas variáveis. No ggplot, usamos o geom_point() para fazer um gráfico de dispersão.
Como exemplo, faremos um gráfico de dispersão que plotará a expectativa de vida de cada país e seu PIB per capita. Por fins de simplificação, primeiramente faremos isso somente para o ano de 2007.
gapminder_2007 = gapminder %>% filter(year == 2007) # Filtramos o ano que desejamos
ggplot(gapminder_2007, aes(x = gdpPercap, y = lifeExp,
color = continent, # Indica que a cor dos pontos será dada em função do continente a que pertence
size = pop)) + # Indica que o tamanho dos pontos será dado em função da população do país
geom_point() + # Especifica o tipo de gráfico
scale_x_log10() + # Indica que a escala do eixo x é em logarítmo
scale_y_log10() # Indica que a escala do eixo y é em logarítmo
Agora, em um gráfico mais elaborado, colocaremos uma divisão por anos e alguns elementos estéticos.
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp,
color = continent, # Indica que a cor dos pontos será dada em função do continente a que pertence
size = pop)) + # Indica que o tamanho dos pontos será dado em função da população do país
geom_point() + # Especifica o tipo de gráfico
labs(x = 'PIB per capita', # Muda o título do eixo x
y = 'Expectativa de Vida', # Muda o título do eixo y
title = 'PIB p.c. x Expectativa de Vida', # Muda o título do gráfico
caption = "Fonte: Gapminder.", # Muda a legenda
color = 'Continente', # Muda o título da legenda de cores
size = 'População')+ # Muda o título da legenda de tamanho
scale_x_log10() + # Indica que a escala do eixo x é em logarítmo
scale_y_log10() + # Indica que a escala do eixo y é em logarítmo
facet_wrap(~ year) # Separa o gráfico em anos
Gráfico de Colunas
O gráfico de colunas é utilizado para indicar valores para uma determinada classe/variável.
Nesse caso, usaremos o geom_col() para visualizarmos qual é o PIB per capita mediano por continente, para o ano de 1952.
# Primeiro utilizamos o filter e o summarize para obter os dados que queremos
by_continent_1952 <- gapminder %>%
filter(year == 1952) %>%
group_by(continent) %>%
summarize(medianGdpPercap = median(gdpPercap))
# Plotamos o gráfico
ggplot(by_continent_1952, aes(x = continent, y = medianGdpPercap)) +
geom_col()
Para o gráfico mais elaborado, iremos fazer um gráfico similar ao acima, porem para todos os anos disponíveis. Além disso, colocaremos alguns elementos estéticos.
# Primeiro utilizamos o filter e o summarize para obter os dados que queremos
by_year_continent <- gapminder %>%
group_by(year, continent) %>%
summarize(medianGdpPercap = median(gdpPercap), .groups = 'keep')
# Plotamos o gráfico
ggplot(by_year_continent, aes(x = continent, y = medianGdpPercap)) +
geom_col() +
labs(x = 'Continente', # Muda o título do eixo x
y = 'PIB p.c. mediano', # Muda o título do eixo y
title = 'PIB p.c. mediano por continente e por ano', # Muda o título do gráfico
caption = "Fonte: Gapminder.") + # Muda a legenda
facet_wrap(~ year) # Separa o gráfico em anos
Boxplot (Gráfico de Caixa)
O Boxplot é muito utilizado em análises estatísticas devido à algumas propriedades interessantes. A imagem abaixo, retirada do OperData, é muito útil para visualizarmos melhor as funcionalidades do boxplot.
Utilizaremos o geom_boxplot() para representar os valores de PIB per capita por continente, para o ano de 1952.
ggplot(gapminder_1952, aes(x = continent, y = gdpPercap)) +
geom_boxplot() +
scale_y_log10()
Para o gráfico mais elaborado, iremos adicionar os outros anos, facetando-os, e adicionar elementos estéticos.
ggplot(gapminder, aes(x = continent, y = gdpPercap)) +
geom_boxplot() +
scale_y_log10() + # Indica que a escala do eixo x é em logarítmo
labs(x = 'Continente', # Muda o título do eixo x
y = 'PIB p.c.', # Muda o título do eixo y
title = 'PIB p.c. por continentes e anos', # Muda o título do gráfico
caption = "Fonte: Gapminder.") + # Muda a legenda
facet_wrap(~year) # Separa o gráfico em anos
Gráfico de Linhas
O gráfico de linhas é um dos gráficos mais utilizados. As análises com 2 variáveis contínuas são muito utilizadas especialmente ao representar séries temporais.
Para o nosso gráfico de exemplo, iremos utilizar o geom_line() para plotar a série temporal de PIB per capita mediano ao longo dos anos.
ggplot(by_year_continent, aes(x = year, y = medianGdpPercap, color = continent)) +
geom_line()
Para o nosso gráfico mais elaborado, iremos adicionar os elementos estéticos ao gráfico.
ggplot(by_year_continent, aes(x = year, y = medianGdpPercap, color = continent)) +
geom_line() +
labs(x = 'Ano', # Muda o título do eixo x
y = 'PIB p.c. mediano', # Muda o título do eixo y
title = 'PIB p.c. mediano por continente', # Muda o título do gráfico
color = 'Continente', # Muda o título da legenda de cores
caption = "Fonte: Gapminder.") # Muda a legenda
Adendo: como salvar seus gráficos ggplot2
Para finalizar o nosso post, iremos ensinar como salvar os seus gráficos feitos com o ggplot2 de uma forma simples e rápida.
Acreditamos que esse é um jeito melhor de salvar as suas imagens do que salvar a partir do visualizador do RStudio, como grande parte dos iniciantes em R fazem.
A função ggsave() do próprio ggplot2 é a melhor ferramenta para isso. Abaixo se encontra um exemplo de sua utilização.
# Um exemplo de gráfico utilizado nesse post
graph = ggplot(gapminder, aes(x = gdpPercap, y = lifeExp, color = continent, size = pop)) +
geom_point() + # Especifica o tipo de gráfico
labs(x = 'PIB per capita', # Muda o título do eixo x
y = 'Expectativa de Vida', # Muda o título do eixo y
title = 'PIB p.c. x Expectativa de Vida', # Muda o título do gráfico
caption = "Fonte: Gapminder.", # Muda a legenda
color = 'Continente', # Muda o título da legenda de cores
size = 'População')+ # Muda o título da legenda de tamanho
scale_x_log10() + # Indica que a escala do eixo x é em logarítmo
scale_y_log10() + # Indica que a escala do eixo y é em logarítmo
facet_wrap(~ year) # Separa o gráfico em anos
# A função para salvá-lo
ggsave(graph, # O objeto ggplot a ser salvo
filename = 'C:/seu-endereço-do-arquivo-aqui/nome-do-arquivo.png', # O endereço do arquivo e seu nome
dpi = 400, # A densidade de pixels da imagem (quanto maior, maior a qualidade das linhas e pontos)
type = 'cairo', # O tipo de salvamento a ser realizado (indicamos o 'cairo' para maior qualidade)
width = 6, # A largura do gráfico
height = 4, # A altura do gráfico
units = 'in') # A unidade de medida das dimensões do gráfico