Criação e Visualização de Gráficos com ggplot2
UFPE
O ggplot2 (https://ggplot2.tidyverse.org/) é um sistema para a criação declarativa de gráficos, baseado na Gramática de Gráficos. Você fornece os dados, informa ao ggplot2 como mapear as variáveis para os atributos estéticos, quais primitivas gráficas usar, e ele cuida dos detalhes1.
Existe uma versão para o
python
chamada de plotnine https://plotnine.org/
Em resumo, a gramática de gráficos nos diz que um gráfico mapeia os dados para atributos estéticos (cor, forma, tamanho) de objetos geométricos (pontos, linhas, barras). Além disso, o gráfico também pode incluir transformações estatísticas nos dados e informações sobre o sistema de coordenadas.
Todos os gráficos são compostos pelos dados, a informação que você deseja visualizar, e um mapeamento, a descrição de como as variáveis dos dados são mapeadas para os atributos estéticos.
Existem cinco componentes de mapeamento:
Todo gráfico em ggplot2 será iniciado com a função ggplot
e, em seguida, adicionaremos dados, e demais informações. Uma dessas opções que podem ser adicionadas na função ggplot
é o aes()
.
aes()
: são mapeamentos estéticos que descrevem como as variáveis dos dados são mapeadas para propriedades visuais (estéticas).library(ggplot2)
# Usando o dataset 'milhas' do pacote 'dados'
milhas <- dados::milhas
# Criando o gráfico com os 5 componentes
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
# Camada de pontos geométricos
geom_point() +
# Escala de cor manual
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
# Sistema de coordenadas polar para um efeito diferenciado
coord_cartesian()+
# Facetando (subdividindo) o gráfico por tipo de tração (drv)
facet_wrap(~ tracao) +
# Tema minimalista para controlar os detalhes visuais
theme_minimal(base_size = 15, base_family = "Arial") +
# Título do gráfico
labs(title = "Consumo na Rodovia vs Cilindrada",
x = "Cilindrada do motor (litros)",
y = "Consumo na rodovia (mpg)",
colour = "Classe do veículo")
library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")
library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")
library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")
library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")
Abrir o RStudio
;
Abrir um novo arquivo R
:
File > New File > R Script
Ctrl + Shift + N
;# A tibble: 3 × 11
fabricante modelo cilindrada ano cilindros transmissao tracao cidade rodovia
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int>
1 audi a4 1.8 1999 4 auto(l5) d 18 29
2 audi a4 1.8 1999 4 manual(m5) d 21 29
3 audi a4 2 2008 4 manual(m6) d 20 31
# ℹ 2 more variables: combustivel <chr>, classe <chr>
tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
$ fabricante : chr [1:234] "audi" "audi" "audi" "audi" ...
$ modelo : chr [1:234] "a4" "a4" "a4" "a4" ...
$ cilindrada : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
$ ano : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
$ cilindros : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
$ transmissao: chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
$ tracao : chr [1:234] "d" "d" "d" "d" ...
$ cidade : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
$ rodovia : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
$ combustivel: chr [1:234] "p" "p" "p" "p" ...
$ classe : chr [1:234] "compacto" "compacto" "compacto" "compacto" ...
Quem desejar entender o que significa cada variável da base pode executar
?dados::milhas
no console.
cilindrada
e rodovia
Vamos separar as observações por tipo do carro
Uma segunda forma de fazer, é:
Utilizando facetamento por tipo do carro
:
Estamos interessados em fazer Box-Plot, logo:
Estamos interessados em fazer Box-Plot, por tipo de carro
, assim:
cilindrada
na cor azul;
Dica: Utilize a função geom_histogram
;
# Verificando a quantidade de informações únicas
milhas |>
sapply(function(x){
x |>
unique() |>
length()
})
fabricante modelo cilindrada ano cilindros transmissao
15 38 35 2 4 10
tracao cidade rodovia combustivel classe
3 21 27 5 7
# A tibble: 5 × 11
fabricante modelo cilindrada ano cilindros transmissao tracao cidade rodovia
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int>
1 audi a4 1.8 1999 4 auto(l5) d 18 29
2 audi a4 1.8 1999 4 manual(m5) d 21 29
3 audi a4 2 2008 4 manual(m6) d 20 31
4 audi a4 2 2008 4 auto(av) d 21 30
5 audi a4 2.8 1999 6 auto(l5) d 16 26
# ℹ 2 more variables: combustivel <chr>, classe <chr>
Vamos construir um gráfico de barras horizontais com percentual por categoria, tema minimalista e na tonalidade azul.
Mas primeiro, vamos entender como tratar os dados e construir o gráfico na forma padrão (vertical), e em seguida ir modificando.
library(dplyr)
# Criando um novo data.frame com proporções
classes_milhas <- milhas |>
count(classe) |>
mutate(prop = round(prop.table(n),2))
#' --------------------
#' Ordenando as colunas pela frequência
classes_milhas$classe <- factor(classes_milhas$classe,
levels = classes_milhas$classe[order(classes_milhas$n, decreasing = F)])
Agora vamos colocar as barras na horizontal e tonalidade azul:
Modificando o tema do gráfico:
removendo os nomes dos eixos x
e y
:
Nosso gráfico final, após algumas adições de camadas:
ggplot(classes_milhas, aes(classe, y = prop)) +
geom_bar(stat = 'identity', fill = "#4789e2") +
coord_flip() +
theme_linedraw() +
xlab("") +
ylab("") +
labs(title = "Tipos de Carros da base Milhas") +
scale_y_continuous(labels = scales::percent_format(), position = "right" ) +
theme(axis.text = element_text(size=10),
plot.title = element_text(color="black", size=15, face="bold.italic"),
#--
axis.title.x = element_blank(),
#--
axis.ticks = element_blank(),
panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "transparent",colour = NA),
plot.background = element_rect(fill = "transparent",colour = NA))
Nosso gráfico final, após algumas adições de camadas:
OBRIGADO!
Slide produzido com quarto
Introdução à Ciência de Dados - Prof. Jodavid Ferreira