Visualização de dados

Aula 3

Bruno Montezano

Grupo Alliance
Programa de Pós-Graduação em Psiquiatria e Ciências do Comportamento
Universidade Federal do Rio Grande do Sul

8 de maio de 2023

Conteúdo de hoje

  • Pacote ggplot2
    • Gramática dos gráficos
    • Estética
    • Mapeamento
  • Gráficos básicos
  • Personalização de gráficos
  • Exemplos práticos
  • Extensões de ggplot2

Que a Força esteja com você!

Para a aula de hoje, vamos usar os dados_starwars.

Este conjunto de dados contém 14 variáveis de 87 personagens dos filmes da saga Star Wars.

No decorrer da aula, vamos introduzir outras bases de dados para exemplificar cada tipo de gráfico.

dados_starwars

library(dados)
library(dplyr)

dados_starwars
# A tibble: 87 × 14
   nome      altura massa cor_do_cabelo cor_da_pele cor_dos_olhos ano_nascimento
   <chr>      <int> <dbl> <chr>         <chr>       <chr>                  <dbl>
 1 Luke Sky…    172    77 Loiro         Branca cla… Azul                    19  
 2 C-3PO        167    75 <NA>          Ouro        Amarelo                112  
 3 R2-D2         96    32 <NA>          Branca, Az… Vermelho                33  
 4 Darth Va…    202   136 Nenhum        Branca      Amarelo                 41.9
 5 Leia Org…    150    49 Castanho      Clara       Castanho                19  
 6 Owen Lars    178   120 Castanho, Ci… Clara       Azul                    52  
 7 Beru Whi…    165    75 Castanho      Clara       Azul                    47  
 8 R5-D4         97    32 <NA>          Branca, Ve… Vermelho                NA  
 9 Biggs Da…    183    84 Preto         Clara       Castanho                24  
10 Obi-Wan …    182    77 Ruivo, Branco Branca cla… Azul acinzen…           57  
# ℹ 77 more rows
# ℹ 7 more variables: sexo_biologico <chr>, genero <chr>, planeta_natal <chr>,
#   especie <chr>, filmes <list>, veiculos <list>, naves_espaciais <list>

ggplot2

Exemplos iniciais de ggplot2

library(ggplot2)

dados_starwars |>
  ggplot() +
  aes(x = massa, y = altura) +
  geom_point(color = "forestgreen", size = 3) +
  xlab("Massa (kg)") +
  ylab("Altura (cm)") +
  ggtitle("Altura e massa dos personagens") +
  theme_bw(base_size = 18)


dados_starwars |>
  filter(!is.na(genero)) |>
  ggplot() +
  aes(x = massa, y = altura, color = genero) +
  geom_point(size = 4, alpha = 0.7) +
  xlab("Massa (kg)") +
  ylab("Altura (cm)") +
  ggtitle("Altura e massa dos personagens",
          "Estratificado por gênero") +
  theme_minimal(base_size = 20) +
  scale_color_discrete(name = "Gênero")

Gramática de gráficos em camadas

O pacote ggplot2 segue duas filosofias que facilitam a compreensão do processo de construção de gráficos:

  • Um gráfico estatístico é uma representação visual dos dados por meio de atributos estéticos (posição, cor, forma, tamanho) de formas geométricas (pontos, linhas, curvas) (Wilkinson 2005)

  • Um gráfico pode ser construído em camadas (sobreposição de elementos visuais) (Wickham 2010)

Camadas

dados_starwars |> 
  ggplot()

dados_starwars |> 
  ggplot() +
  aes(x = massa, y = altura)

dados_starwars |> 
  ggplot() +
  aes(x = massa, y = altura) +
  geom_point()

dados_starwars |> 
  ggplot() +
  aes(x = massa, y = altura, color = genero) +
  geom_point()

dados_starwars |> 
  ggplot() +
  aes(x = massa, y = altura, shape = sexo_biologico) +
  geom_point()

Por que o +?

O ggplot2, diferentemente dos outros pacotes do Tidyverse, não usa o pipe (|>) porque o ggplot2 surgiu antes que o autor tomasse conhecimento do pipe.

Dica: Como escolher o gráfico mais adequado?

Gráfico de pontos (dispersão)

Geralmente usado para visualizar a associação de duas variáveis contínuas.

Exemplo: verificar a associação entre altura e massa nos personagens do Star Wars.

# O código abaixo gera a figura do slide
dados_starwars |>
  filter(massa < 1000) |>
  ggplot() +
  aes(x = massa, y = altura) +
  geom_point()
1
Usar os dados_starwars
2
Manter apenas observações
com menos de
1.000kg de massa
3
Iniciar o canvas do ggplot2
4
Mapear massa no eixo x
e altura no eixo y
5
Adicionar geometria de pontos
com geom_point()

ggplot2 é extremamente versátil

dados_gapminder

Para aprender o próximo gráfico, vamos usar os dados_gapminder.

Trata-se de um projeto sueco criado por Hans Rosling que coleta dados sobre diversas tendências globais. Na parte dos dados que vamos utilizar, temos informações de 1952 a 2007 (intervalos de 5 anos).

Estes dados possuem 1.704 observações e 6 variáveis, sendo elas: pais, continente, ano, expectativa_de_vida, populacao, pib_per_capita.

Exibindo dados_gapminder

dados_gapminder
# A tibble: 1,704 × 6
   pais        continente   ano expectativa_de_vida populacao pib_per_capita
   <fct>       <fct>      <int>               <dbl>     <int>          <dbl>
 1 Afeganistão Ásia        1952                28.8   8425333           779.
 2 Afeganistão Ásia        1957                30.3   9240934           821.
 3 Afeganistão Ásia        1962                32.0  10267083           853.
 4 Afeganistão Ásia        1967                34.0  11537966           836.
 5 Afeganistão Ásia        1972                36.1  13079460           740.
 6 Afeganistão Ásia        1977                38.4  14880372           786.
 7 Afeganistão Ásia        1982                39.9  12881816           978.
 8 Afeganistão Ásia        1987                40.8  13867957           852.
 9 Afeganistão Ásia        1992                41.7  16317921           649.
10 Afeganistão Ásia        1997                41.8  22227415           635.
# ℹ 1,694 more rows

Gráfico de linhas

Utilizamos o geom_line() para fazer gráficos de linhas. Eles são ótimos para representar séries temporais, ou seja, observações medidas repetidamente em intervalos de tempo.

Tal qual no gráfico de pontos, precisamos definir as posições \(x\) e \(y\) para construirmos os gráficos de linhas.

No próximo slide, vamos olhar um exemplo de gráfico de linha do PIB per capita do Brasil ao decorrer dos anos.

PIB per capita do Brasil

dados_gapminder |> 
  filter(pais == "Brasil") |> 
  ggplot() +
  aes(x = ano, y = pib_per_capita) +
  geom_line()

dados_gapminder |> 
  filter(pais == "Brasil") |> 
  ggplot() +
  aes(x = ano, y = pib_per_capita) +
  geom_line() +
  scale_x_continuous(breaks = seq(1952, 2007, 5)) +
  scale_y_continuous(labels = scales::dollar_format(prefix = "R$ ",
                                             decimal.mark = ",",
                                             big.mark = "."))

dados_gapminder |> 
  filter(pais == "Brasil") |> 
  ggplot() +
  aes(x = ano, y = pib_per_capita) +
  geom_line(linewidth = 2, color = "darkslateblue") +
  scale_x_continuous(breaks = seq(1952, 2007, 5)) +
  scale_y_continuous(labels = scales::dollar_format(prefix = "R$ ",
                                             decimal.mark = ",",
                                             big.mark = ".")) +
  labs(x = "Ano", y = "PIB per capita",
       title = "PIB per capita do Brasil ao passar dos anos",
       subtitle = "De 1952 a 2007",
       caption = "Fonte: Gapminder") +
  theme_minimal(base_size = 16, base_family = "Charter")

Como os filmes da Pixar foram avaliados?

Para o próximo gráfico, vamos tentar responder a seguinte pergunta:

“Segundo a CinemaScore, qual a nota mais recebida pelos filmes da Pixar?”

Para isso, vamos usar outra base de dados do pacote dados, chamada pixar_avalicao_publico.

pixar_avalicao_publico

pixar_avalicao_publico
# A tibble: 24 × 5
   filme                  nota_rotten_tomatoes nota_metacritic nota_cinema_score
   <chr>                                 <dbl>           <dbl> <chr>            
 1 Toy Story - Um Mundo …                  100              95 A                
 2 Vida de Inseto                           92              77 A                
 3 Toy Story 2                             100              88 A+               
 4 Monstros S. A.                           96              79 A+               
 5 Procurando Nemo                          99              90 A+               
 6 Os Incríveis                             97              90 A+               
 7 Carros                                   74              73 A                
 8 Ratatouille                              96              96 A                
 9 WALL-E                                   95              95 A                
10 Up - Altas Aventuras                     98              88 A+               
# ℹ 14 more rows
# ℹ 1 more variable: nota_critics_choice <dbl>
pixar_avalicao_publico |> 
  count(nota_cinema_score) # A função count() serve para contar os valores únicos de uma variável
# A tibble: 4 × 2
  nota_cinema_score     n
  <chr>             <int>
1 A                    13
2 A+                    7
3 A-                    2
4 <NA>                  2

Gráfico de barras

O gráfico de barras é muito usado para apresentar a frequência de uma determinada categoria de uma variável.

No exemplo a seguir, acrescentamos o ggplot2 ao código do slide anterior para criar um gráfico de barras com a frequência de cada nota (A-, A, A+) dos filmes da Pixar segundo o CinemaScore.

Exemplo de gráfico de barras

# Este código gera o gráfico abaixo
pixar_avalicao_publico |>
  count(nota_cinema_score) |>
  ggplot() +
  aes(x = nota_cinema_score, y = n) +
  geom_col()
1
Usar a base pixar_avalicao_publico
2
Contar número de filmes
em cada nota
3
Iniciar o canvas do ggplot2
4
Mapear os eixos x e y
5
Adicionar a geometria do
gráfico de barras

Gráfico de barras após ajustes

# O código abaixo gera o gráfico do painel ao lado
pixar_avalicao_publico |>
  rename(nota = nota_cinema_score) |>
  count(nota) |>
  mutate(
    nota = forcats::fct_na_value_to_level(nota,
                                          "Sem escore"),
    nota = factor(nota,
                  levels = c("A-", "A",
                             "A+",
                             "Sem escore")),
    cor = dplyr::case_when(nota == "A" ~ "Colorido",
                           .default = "Cinza")
  ) |>
  ggplot() +
  aes(x = nota, y = n, fill = cor) +
  geom_col(width = 0.5, show.legend = FALSE) +
  scale_fill_manual(values = c("gray25", "darkorange")) +
  labs(title = "A maioria dos filmes da Pixar (n = 13) receberam nota A.",
       x = "Nota segundo CinemaScore",
       y = "Número de filmes") +
  theme_classic(base_size = 18, base_family = "Charter")
1
Pegar base da Pixar de
avaliação do público
2
Renomear variável
nota_cinema_score
3
Contar o número de
filmes com cada nota
4
Transformar NA no
valor “Sem escore”
5
Reordenar as notas
da menor para a maior
6
Criar variável para
colorir barra principal
7
Iniciar o canvas do ggplot2
8
Mapear variáveis do gráfico
9
Adicionar a geometria
do gráfico de barras,
retirar legenda e
mudar largura das barras
10
Modificar as cores
do preenchimento
11
Adicionar título e rótulos
12
Modificar tema,
tamanho e
família da fonte

Histograma

Histogramas são úteis para avaliarmos a distribuição de uma variável numérica.

Para criar histogramas, usamos o geom_histogram(). Para isso, precisamos apenas do atributo \(x\) (o eixo \(y\) é construído de forma automática).

Na sequência, podemos observar um exemplo de histograma das notas dos filmes da Pixar no Rotten Tomatoes.

pixar_avalicao_publico |> 
  ggplot() +
  aes(x = nota_rotten_tomatoes) +
  geom_histogram()

Exemplo de histograma “mais bonito”

pixar_avalicao_publico |> 
  ggplot() +
  aes(x = nota_rotten_tomatoes) +
  geom_histogram(fill = "cyan4") +
  labs(x = "Nota segundo críticos do Rotten Tomatoes",
       y = "Contagem",
       title = "Como se distribuem as notas segundo os críticos do Rotten Tomatoes?",
       subtitle = "Dados de 24 filmes da Pixar",
       caption = "Fonte: Wikipedia") +
  theme_light(base_size = 16, base_family = "Charter")

Box plot

Os box plots são úteis para estudar a distribuição de uma variável, especialmente ao comparar várias distribuições.

Para construir um box plot, usamos o geom_boxplot(). Para tal, usamos atributos \(x\) e \(y\), mapeando uma variável categórica para o atributo \(x\).

dados_gapminder |> 
  filter(ano == 1952) |> 
  ggplot() +
  aes(x = continente, y = expectativa_de_vida) +
  geom_boxplot()

Box plot após ajustes

dados_gapminder |> 
  filter(ano == 1952) |> 
  ggplot() +
  aes(x = continente, y = expectativa_de_vida, color = continente) +
  geom_boxplot(show.legend = FALSE) +
  theme_classic(base_size = 16, base_family = "Charter") +
  labs(x = "Continente", y = "Expectativa de vida (em anos)",
       title = "Como se distribuía a expectativa de vida em cada continente em 1952?",
       caption = "Fonte: Gapminder") +
  annotate("text", x = 1, y = 65,
           label = "Em 1952,\na África tinha\numa expectativa\nde vida\nde 38,8 anos.",
           size = 5,
           family = "Charter")

Títulos, labels e escalas

Para colocar títulos ou trocar os labels (rótulos) dos atributos, utilizamos a função labs().

Para mudar as escalas (textos e quebras), usamos as funções da família scale_[estética]_[opção]().

Para definir qual porção do gráfico deve ser mostrada (limites), podemos usar as funções xlim() e ylim().

Cores

Para escolher manualmente as cores que coloriram ou preencheram um plot, use as funções scale_color_manual() ou scale_fill_manual().

Para trocar o nome das legendas geradas por atributos de cor, use as funções scale_color_discrete() ou scale_fill_discrete().

Temas

Como vocês devem ter percebido, o ggplot2 traz consigo alguns temas prontos a partir de funções da família theme_[estilo_do_tema].

Você também pode criar o seu próprio tema usando a função theme(). Não teremos como ver durante as aulas, pois requer um pouco mais de conhecimento técnico, mas é um processo divertido de aprender!

Dica: Extensões do ggplot2

Tarefa de casa

  • A partir dos dados pinguins do pacote dados, crie:
    • Um gráfico de pontos (dispersão)
    • Um box plot (variável numérica estratificada por uma variável categórica)
    • Um histograma
  • Escolha um dos seus gráficos para ajustá-lo e deixá-lo visualmente mais agradável!
    • Ajustar rótulos, tamanho da fonte, cores, adicionar título, e o que mais você achar importante
    • Lembre-se da função labs() e família theme_[estilo_do_tema]()

Dica de leitura sobre visualização

  • Data Visualization: A Practical Introduction
    • Como criar visualizações efetivas
    • Quais visualizações funcionam e quais não
    • Como criar vários tipos de gráficos em ggplot2
    • Como refinar os gráficos para apresentação

Referências

Wickham, Hadley. 2010. “A layered grammar of graphics”. Journal of Computational and Graphical Statistics 19 (1): 3–28. https://doi.org/10.1198/jcgs.2009.07098.
Wilkinson, Leland. 2005. The Grammar of Graphics. Springer-Verlag. https://doi.org/10.1007/0-387-28695-0.