Gráfico de barras

Nesta aula vamos abordar como construir gráficos de barras utilizando tidyverse e ggplot2. Se esse é seu primeiro vídeo sobre ggplot2, recomendo assistir antes os 2 outros vídeos do canal primeiro, onde explico a lógica geral do pacote ggplot2 e como construir histogramas e gráficos de dispersão.

Os gráficos de barras são muito úteis para resumir dados e muito comuns para mostrar resultados de experimentos e realizar comparações entre fatores ou variáveis qualitativas.

Gráfico de barras simples

Vamos a um exemplo simples utilizando nosso conhecido pacote starwars. Iniciando por um problema simples, vamos contar quantos personagens existem para cada cor de olhos existente no conjunto de dados:

library(tidyverse)
library(ggplot2)
data(starwars)

starwars %>%
  group_by(eye_color) %>%
  summarise(
    n = n()
  )
## # A tibble: 15 x 2
##    eye_color         n
##    <chr>         <int>
##  1 black            10
##  2 blue             19
##  3 blue-gray         1
##  4 brown            21
##  5 dark              1
##  6 gold              1
##  7 green, yellow     1
##  8 hazel             3
##  9 orange            8
## 10 pink              1
## 11 red               5
## 12 red, blue         1
## 13 unknown           3
## 14 white             1
## 15 yellow           11

Em seguida, vamos apresentar essa informação em formato de gráfico ao invés de tabela:

starwars %>%
  group_by(eye_color) %>%
  summarise(
    n = n()
  ) %>%
  ggplot(aes(x = eye_color, y = n)) +
  geom_bar(stat = "identity") # stat = identity para usar a métrica sem transformar.

Note que, apesar deste gráfico bonito, temos muitas categorias a serem mostradas. Neste caso, gosto de fazer uma modificação: colocar as barras em posição horizontal. Isso facilita muito a leitura das categorias:

starwars %>%
  group_by(eye_color) %>%
  summarise(
    n = n()
  ) %>%
  ggplot(aes(x = eye_color, y = n)) +
  geom_bar(stat = "identity") +
  coord_flip()

Por fim, neste exemplo, vamos adicionar os rótulos em cada barra, facilitando a leitura do gráfico:

starwars %>%
  group_by(eye_color) %>%
  summarise(
    n = n()
  ) %>%
  ggplot(aes(x = eye_color, y = n, label = n)) +
  geom_bar(stat = "identity") +
  geom_label() + # este comando adiciona os rótulos
  coord_flip()

Desta forma agora podemos concluir que as cores de olhos mais frequentes são marrom (brown), azul (blue) e amarelo (yellow), respectivamente. Mais adiante veremos outras formas de personalizar este gráfico para ficar mais bonito.

Comparação de dois fatores

Vamos a seguir para um exemplo um pouco mais complicado, onde vamos comparar dois fatores: gênero (gender) e cor do cabelo (hair_color). Para isso, precisamos preparar nossa tabela de frequências:

starwars %>%
  group_by(hair_color, gender) %>%
  summarise(n = n())
## # A tibble: 20 x 3
## # Groups:   hair_color [13]
##    hair_color    gender        n
##    <chr>         <chr>     <int>
##  1 auburn        feminine      1
##  2 auburn, grey  masculine     1
##  3 auburn, white masculine     1
##  4 black         feminine      3
##  5 black         masculine     9
##  6 black         <NA>          1
##  7 blond         masculine     3
##  8 blonde        feminine      1
##  9 brown         feminine      6
## 10 brown         masculine    11
## 11 brown         <NA>          1
## 12 brown, grey   masculine     1
## 13 grey          masculine     1
## 14 none          feminine      5
## 15 none          masculine    31
## 16 none          <NA>          1
## 17 unknown       <NA>          1
## 18 white         feminine      1
## 19 white         masculine     3
## 20 <NA>          masculine     5

E em seguida transformar em gráfico utilizando o que já aprendemos:

starwars %>%
  group_by(hair_color, gender) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = hair_color, y = n, fill = gender, label = n)) + # fill adiciona cores ao 2o fator: gender
  geom_bar(stat = "identity") +
  geom_label(position = "stack") + # especificar a posição por ser gráfico empilhado
  coord_flip()

Exemplo simples: experimento de 2 fatores

Vamos montar um gráfico mais tradicional. Imagine que você tem um experimento com 2x2 fatores com interação entre deles cujos dados fictícios são produzidos a seguir:

experimento = data.frame(
  fator_a = c("nivel 1","nivel 1", "nivel 2", "nivel 2"), 
  fator_b = c("nivel 1","nivel 2", "nivel 1", "nivel 2"),
  media_valores = c(55,23,9,77)
  )
experimento
##   fator_a fator_b media_valores
## 1 nivel 1 nivel 1            55
## 2 nivel 1 nivel 2            23
## 3 nivel 2 nivel 1             9
## 4 nivel 2 nivel 2            77

E gráfico de barras, com 2 fatores, pode ser produzido da seguinte forma:

experimento %>%
  ggplot(aes(x = fator_a, y = media_valores, fill = fator_b, label = media_valores)) +
  geom_bar(stat = "identity", position="dodge") + # Posição dodge para colocar barras lado a lado
  geom_label(position = position_dodge(width = 1)) # Para label, dodge é especificado de forma diferente