Introdução à Ciência de Dados

Criação e Visualização de Gráficos com ggplot2

Prof. Jodavid Ferreira

UFPE






GGPLOT 2


ggplot2


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.

ggplot2



Existe uma versão para o python chamada de plotnine https://plotnine.org/


ggplot2



library(ggplot2)

milhas <- dados::milhas

ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
  geom_point()

ggplot2



O que é gramática de dados?

  • Foi criado em 2005 por Wilkinson para descrever as características fundamentais que estão por trás de todos os gráficos estatísticos.

  • A gramática de gráficos vem auxiliar na resposta à pergunta:

O que é um gráfico estatístico?

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.

ggplot2



  • O ggplot2 (Wickham 2009) baseia-se na gramática de Wilkinson, focando na primazia das camadas e adaptando-a para uso no R.
  • 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:

    • Camadas;
    • Escalas;
    • Coordenadas;
    • Facetas;
    • Temas.

ggplot2



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)

milhas <- dados::milhas

ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
  geom_point()

ggplot2



Camadas:

  • As camadas são coleções de elementos geométricos e transformações estatísticas. Os elementos geométricos, conhecidos como geoms, representam o que você realmente vê no gráfico: pontos, linhas, polígonos, etc. As transformações estatísticas, chamadas de stats, resumem os dados: por exemplo, agrupando e contando observações para criar um histograma ou ajustando um modelo.
library(ggplot2)

milhas <- dados::milhas

ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
  geom_point()


O exemplo anterior não possui todas as camadas, vamos considerar um novo exemplo!

ggplot2



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")

ggplot2



ggplot2



Escalas:

  • As Escalas mapeiam valores no espaço dos dados para valores no espaço estético. Isso inclui o uso de cor, forma ou tamanho. As escalas também desenham a legenda e os eixos, que possibilitam a leitura dos valores originais dos dados a partir do gráfico (um mapeamento inverso).
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")

ggplot2



Coordenadas:

  • As Coordenadas ou sistema de coordenadas, descreve como as coordenadas dos dados são mapeadas no plano gráfico. Ele também fornece eixos e linhas de grade para ajudar a ler o gráfico. Normalmente usamos o sistema de coordenadas Cartesiano, mas vários outros estão disponíveis, incluindo coordenadas polares e projeções de mapas.
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")

ggplot2



Facetas:

  • As facetas especificam como dividir e exibir subconjuntos de dados como múltiplos gráficos pequenos. Isso também é conhecido como condicionamento ou latticing/trellising.
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")

ggplot2



Temas:

  • Os temas controlam os detalhes mais finos de exibição, como o tamanho da fonte e a cor de fundo. Embora os padrões no ggplot2 tenham sido escolhidos com cuidado, pode ser necessário consultar outras referências para criar um gráfico mais atraente e editar os existentes da melhor forma que preferir.
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")

ggplot2


Vamos praticar!

  1. Abrir o RStudio;

  2. Abrir um novo arquivo R:

    • File > New File > R Script
    • ou \(\quad\) Ctrl + Shift + N;
  1. Vamos instalar o pacote dados para pegar base de dados:
install.packages("dados")
  1. Ler a base e visualizar as primeiras linhas:
library(ggplot2)

milhas <- dados::milhas

milhas |> 
  head(3)

ggplot2


# 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>
  1. Vamos visualizar o tipo das variáveis
str(milhas)
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.

ggplot2



  1. Vamos criar um gráfico de dispersão entre as colunas cilindrada e rodovia
ggplot(milhas, aes(x = cilindrada, y = rodovia)) + 
  geom_point()

ggplot2



Vamos separar as observações por tipo do carro

ggplot(milhas, aes(x = cilindrada, y = rodovia, colour = classe)) + 
  geom_point()

ggplot2



Uma segunda forma de fazer, é:

ggplot(milhas, aes(x = cilindrada, y = rodovia)) + 
  geom_point(aes(colour = classe))

ggplot2



Utilizando facetamento por tipo do carro:

ggplot(milhas, aes(x = cilindrada, y = rodovia)) + 
  geom_point() + 
  facet_wrap(~classe)

ggplot2



Estamos interessados em fazer Box-Plot, logo:

ggplot(milhas, aes(x = cilindrada, y = rodovia)) + 
  geom_boxplot()

ggplot2



Estamos interessados em fazer Box-Plot, por tipo de carro, assim:

ggplot(milhas, aes(x = cilindrada, y = rodovia)) + 
  geom_boxplot() + 
  facet_wrap(~classe)

ggplot2


Façam um histogama da variável cilindrada na cor azul;

Dica: Utilize a função geom_histogram;

ggplot(milhas, aes(x = cilindrada)) + 
  geom_histogram(fill="red")

ggplot2


# 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 
milhas |> 
  head(5)
# 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>

ggplot2


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)])

ggplot2


ggplot(classes_milhas, aes(classe, y = prop)) + 
  geom_bar(stat = 'identity')

ggplot2


Agora vamos colocar as barras na horizontal e tonalidade azul:

ggplot(classes_milhas, aes(classe, y = prop)) + 
  geom_bar(stat = 'identity', fill = "#4789e2") +
  coord_flip()

ggplot2


Modificando o tema do gráfico:

ggplot(classes_milhas, aes(classe, y = prop)) + 
  geom_bar(stat = 'identity', fill = "#4789e2") +
  coord_flip() +
  theme_linedraw()

ggplot2


removendo os nomes dos eixos xe y:

ggplot(classes_milhas, aes(classe, y = prop)) + 
  geom_bar(stat = 'identity', fill = "#4789e2") +
  coord_flip() +
  theme_linedraw() +
  xlab("") +
  ylab("")

ggplot2


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" )

ggplot2


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))

ggplot2


Nosso gráfico final, após algumas adições de camadas:

Referências para serem utilizadas







OBRIGADO!


Slide produzido com quarto