Este é o segundo post de uma série que estou fazendo sobre tipos de gráficos. Falamos um pouco sobre o boxplot e agora vamos ao gráfico de barras.

Gráficos de barras são muito úteis para podermos comparar fatores. Quando estão um ao lado do outro a comparação é feita rapidamente, já que as barras dão a noção de escala. Normalmente as barras informam um resumo (i. e. média, soma ou contagem), mas podemos ainda adicionar uma barra de erro ou desvio e deixar o gráfico mais detalhado.

Continuaremos com o banco de dados apresentado no post sobre tidy data.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(readr, dplyr, ggplot2)
dados <- read_csv2(
  "https://github.com/italocegatta/italocegatta.github.io_source/raw/master/content/dados/base_vespa.csv"
)

dados
## # A tibble: 2,100 x 5
##    Tratamento Individuo Coleta Local   Galhas
##    <chr>          <dbl>  <dbl> <chr>    <dbl>
##  1 Actara d1          1      1 Peciolo      1
##  2 Actara d1          2      1 Peciolo     NA
##  3 Actara d1          3      1 Peciolo     NA
##  4 Actara d1          4      1 Peciolo     NA
##  5 Actara d1          5      1 Peciolo     NA
##  6 Actara d1          6      1 Peciolo     NA
##  7 Actara d1          7      1 Peciolo     NA
##  8 Actara d1          8      1 Peciolo     NA
##  9 Actara d1          9      1 Peciolo     NA
## 10 Actara d1         10      1 Peciolo     NA
## # ... with 2,090 more rows

Básico

A primeira sequência de gráficos está relacionada ao total de galhas encontradas nas mudas de cada tratamento. Nessa comparação, temos de considerar tratamentos como fatores e os locais onde a galha foi encontrada como níveis do fator local. Essa distinção vai nos ajuda a escolher a melhor forma de construir um gráfico de acordo com o que queremos mostrar.

# seleciona apenas as Coletas de numero 5, em seguida monta um fator de 
# agrupamento em função de Tratamento. Aplica a soma de todas as
# observações (Galhas) de acordo com o fator de agrupamento.

total_trat <- dados %>%
  filter(Coleta == 5) %>%
  group_by(Tratamento) %>%
  summarise(Galhas = sum(Galhas, na.rm=T))

total_trat
## # A tibble: 7 x 2
##   Tratamento  Galhas
##   <chr>        <dbl>
## 1 Actara d1       73
## 2 Actara d2       57
## 3 Actara d3       30
## 4 Evidence d1     27
## 5 Evidence d2     21
## 6 Evidence d3     12
## 7 Testemunha      77

Agora já podemos fazer o primeiro gráfico simples e básico (Figura 1).

ggplot(total_trat, aes(Tratamento, Galhas)) +
  geom_col(alpha = 0.8) +
  theme_bw(16)
Número total de galhas de cada tratamento.

Figura 1: Número total de galhas de cada tratamento.

Mas ainda temos a variável Local, certo? Podemos apresentá-la sem muito esforço.

total_trat_local <- dados %>%
  filter(Coleta == 5) %>%
  group_by(Tratamento, Local) %>%
  summarise(Galhas = sum(Galhas, na.rm=T))

total_trat_local
## # A tibble: 21 x 3
## # Groups:   Tratamento [7]
##    Tratamento  Local   Galhas
##    <chr>       <chr>    <dbl>
##  1 Actara d1   Caule       13
##  2 Actara d1   Nervura     19
##  3 Actara d1   Peciolo     41
##  4 Actara d2   Caule       10
##  5 Actara d2   Nervura      9
##  6 Actara d2   Peciolo     38
##  7 Actara d3   Caule        7
##  8 Actara d3   Nervura      6
##  9 Actara d3   Peciolo     17
## 10 Evidence d1 Caule        6
## # ... with 11 more rows
ggplot(total_trat_local, aes(Tratamento, Galhas, fill = Local)) +
  geom_col(alpha = 0.8) +
  scale_fill_brewer(palette = "Dark2") +
  theme_bw(16)
Número total de galhas de cada tratamento em diferentes locais - níveis agrupados.

Figura 2: Número total de galhas de cada tratamento em diferentes locais - níveis agrupados.

No caso da Figura 2, à primeira vista comparamos as barras (fatores) e depois as cores (níveis). Podemos dar mais evidência aos níveis, transformando-os em barras como na Figura 3.

ggplot(total_trat_local, aes(Tratamento, Galhas, fill = Local)) +
  geom_col(alpha = 0.8, position = "dodge") +
  scale_fill_brewer(palette = "Dark2") +
  theme_bw(16)
Número total de galhas de cada tratamento em diferentes locais - níveis lado a lados.

Figura 3: Número total de galhas de cada tratamento em diferentes locais - níveis lado a lados.

Como alternativa, podemos subdividir os níveis em painéis e deixar o gráfico mais balanceado, ou seja, sem concentrar a informação em fatores ou níveis (Figura 4).

ggplot(total_trat_local, aes(Tratamento, Galhas )) +
  geom_col(alpha = 0.8, position = "dodge") +
  facet_wrap(~Local) +
  theme_bw(16) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
Número total de galhas de cada tratamento em diferentes locais - níveis em painel.

Figura 4: Número total de galhas de cada tratamento em diferentes locais - níveis em painel.

Note que nos 3 gráficos anteriores o banco de dados para formação do gráfico é o mesmo, mas cada um dá ênfase em um aspecto diferente. A parte boa é que podemos modificá-los de acordo com o nosso interesse de uma forma rápida e bem simples.

Adicionando valores às barras

Se quisermos adicionar o valor de cada nível ou fator na barra, temos de alterar o banco de dados para que ele coincida com o que queremos mostrar.

Para a Figura 5, modificamos apenas o código do gráfico.

ggplot(total_trat, aes(Tratamento, Galhas)) +
  geom_col(alpha = 0.8) +
  geom_text(aes(label = Galhas), size = 6, vjust = -0.2) +
  theme_bw(16)
Número total de galhas de cada tratamento com o valor na respectiva barra.

Figura 5: Número total de galhas de cada tratamento com o valor na respectiva barra.

Também é fácil indicar o número de galhas por local nas barras. A função position_stack() é responsável por colocar o texto no topo de cada compartimento colorido. Para ficar mais atraente, podemos adicionar um parâmetro para que o texto fique 20% a baixo do topo do compartimento. Como resultado temos a Figura 6.

# Cria uma nova coluna que contem a posição no eixo y que corresponde ao centro
# da barra. Esta posição correnponde ao local onde o label de cada barra
# será mostrado

ggplot(total_trat_local, aes(Tratamento, Galhas, fill = Local)) +
    geom_col(alpha = 0.8) +
    geom_text(
      aes(label = Galhas),
      position =  position_stack(vjust = 0.8), vjust = 1
    ) +
    scale_fill_brewer(palette = "Dark2") +
    theme_bw(16) 
Número total de galhas de cada tratamento em diferentes locais com o valor da respectiva barra - níveis agrupados.

Figura 6: Número total de galhas de cada tratamento em diferentes locais com o valor da respectiva barra - níveis agrupados.

As Figuras 7 e 8 foram criadas apenas alterando o código do gráfico.

ggplot(total_trat_local, aes(Tratamento, Galhas, fill = Local)) +
    geom_col(alpha = 0.8, position = "dodge") +
    geom_text(
      aes(label = Galhas),
      position = position_dodge(width=0.9), vjust = -0.2
    ) +
    scale_fill_brewer(palette = "Dark2") +
    theme_bw(16) 
Número total de galhas de cada tratamento em diferentes locais com o valor da respectiva barra - níveis lado a lados.

Figura 7: Número total de galhas de cada tratamento em diferentes locais com o valor da respectiva barra - níveis lado a lados.

ggplot(total_trat_local, aes(Tratamento, Galhas )) +
  geom_col(alpha = 0.8) +
  geom_text(aes(label = Galhas), vjust = -0.2) +
  facet_wrap(~Local) +
  theme_bw(16) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
Número total de galhas de cada tratamento em diferentes locais com o valor da respectiva barra - níveis em painel.

Figura 8: Número total de galhas de cada tratamento em diferentes locais com o valor da respectiva barra - níveis em painel.

Barra de desvio

Uma outra informação interessante para o gráfico de barras é a barra de erro ou desvio. Com ela, além de informarmos o valor que queremos, também informamos uma medida de dispersão associada a esse valor. Nos gráficos anteriores apresentei o total de galhas por tratamento e local. Não faz sentido, nesse caso, colocar uma barra de desvio, pois a soma não é uma medida de posição. Portanto, vamos resumir novamente os dados em função da média e acrescentar o erro padrão da média.

# Seleciona apenas as Coletas de numero 5, em seguida calcula a média e o
# desvio padrão de cada Tratamento.

media_trat_desv <- dados %>%
  filter(Coleta == 5) %>%
  group_by(Tratamento) %>%
  summarise(desv = sd(Galhas, na.rm=T)/sqrt(n()),
    Galhas = mean(Galhas, na.rm=T))

media_trat_desv
## # A tibble: 7 x 3
##   Tratamento   desv Galhas
##   <chr>       <dbl>  <dbl>
## 1 Actara d1   0.480   4.06
## 2 Actara d2   0.489   3.35
## 3 Actara d3   0.133   2.31
## 4 Evidence d1 0.589   3.86
## 5 Evidence d2 0.267   2.62
## 6 Evidence d3 0.163   2   
## 7 Testemunha  0.360   3.35

Após criar o data frame com o desvio, a Figura 9 é facilmente criada com o código abaixo.

ggplot(media_trat_desv, aes(Tratamento, Galhas)) +
  geom_col(alpha = 0.8) +
  geom_errorbar(
    aes(ymin = Galhas - desv, ymax = Galhas + desv), 
    width = 0.4, alpha = 0.8
  ) +
  theme_bw(16)
Número total de galhas de cada tratamento com barra de desvio.

Figura 9: Número total de galhas de cada tratamento com barra de desvio.

No caso das Figuras 10 e 11, precisamos dos dados agrupados por Tratamento e Local. O código para o gráfico é muito semelhante aos anteriores. Em alguns tratamentos há somente um indivíduo com contagem de galhas, portanto, nesta situação não há barra de desvio.

# Seleciona apenas as Coletas de numero 5, em seguida calcula a mediana e o
# desvio padrão em função de cada Trtatamento e Local.

mediana_trat_local_desv <- dados %>%
  filter(Coleta == 5) %>%
  group_by(Tratamento, Local) %>%
  summarise(desv = sd(Galhas, na.rm=T)/sqrt(n()),
    Galhas = median(Galhas, na.rm=T))

mediana_trat_local_desv
## # A tibble: 21 x 4
## # Groups:   Tratamento [7]
##    Tratamento  Local    desv Galhas
##    <chr>       <chr>   <dbl>  <dbl>
##  1 Actara d1   Caule   0.329      2
##  2 Actara d1   Nervura 0.828      3
##  3 Actara d1   Peciolo 1.02       4
##  4 Actara d2   Caule   0.271      1
##  5 Actara d2   Nervura 0.281      2
##  6 Actara d2   Peciolo 1.18       4
##  7 Actara d3   Caule   0.112      2
##  8 Actara d3   Nervura 0          2
##  9 Actara d3   Peciolo 0.297      3
## 10 Evidence d1 Caule   0.224      2
## # ... with 11 more rows
ggplot(mediana_trat_local_desv, aes(Tratamento, Galhas, fill = Local)) +
  geom_col(alpha = 0.5, position = "dodge") +
  geom_errorbar(
    aes(ymin = Galhas - desv, ymax = Galhas + desv),
    position = position_dodge(width=0.9), 
    width = 0.4, alpha = 0.8
  ) +
  scale_fill_brewer(palette = "Dark2") +
  theme_bw(16)
Número total de galhas de cada tratamento em diferentes locais com barra de desvio - níveis lado a lado.

Figura 10: Número total de galhas de cada tratamento em diferentes locais com barra de desvio - níveis lado a lado.

ggplot(mediana_trat_local_desv, aes(Tratamento, Galhas )) +
  geom_col(alpha = 0.8, position = "dodge") +
  geom_errorbar(
    aes(ymin = Galhas - desv, ymax = Galhas + desv),
    width = 0.4, alpha = 0.8
  ) +
  facet_wrap(~Local) +
  theme_bw(16) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
Número total de galhas de cada tratamento em diferentes locais com barra de desvio - níveis em painel.

Figura 11: Número total de galhas de cada tratamento em diferentes locais com barra de desvio - níveis em painel.

Caso tenha alguma dúvida ou sugestão sobre o post, fique à vontade para fazer um comentário ou me contatar por E-mail.

sessioninfo::session_info(c("readr", "dplyr", "ggplot2"))
## - Session info ----------------------------------------------------------
##  setting  value                       
##  version  R version 3.5.3 (2019-03-11)
##  os       Windows 10 x64              
##  system   x86_64, mingw32             
##  ui       RTerm                       
##  language (EN)                        
##  collate  Portuguese_Brazil.1252      
##  ctype    Portuguese_Brazil.1252      
##  tz       America/Sao_Paulo           
##  date     2019-08-25                  
## 
## - Packages --------------------------------------------------------------
##  package      * version  date       lib source        
##  assertthat     0.2.1    2019-03-21 [1] CRAN (R 3.5.3)
##  backports      1.1.4    2019-04-10 [1] CRAN (R 3.5.3)
##  BH             1.69.0-1 2019-01-07 [1] CRAN (R 3.5.2)
##  cli            1.1.0    2019-03-19 [1] CRAN (R 3.5.3)
##  clipr          0.7.0    2019-07-23 [1] CRAN (R 3.5.3)
##  colorspace     1.4-1    2019-03-18 [1] CRAN (R 3.5.3)
##  crayon         1.3.4    2017-09-16 [1] CRAN (R 3.5.1)
##  digest         0.6.20   2019-07-04 [1] CRAN (R 3.5.3)
##  dplyr        * 0.8.3    2019-07-04 [1] CRAN (R 3.5.3)
##  ellipsis       0.2.0.1  2019-07-02 [1] CRAN (R 3.5.3)
##  fansi          0.4.0    2018-10-05 [1] CRAN (R 3.5.1)
##  ggplot2      * 3.2.1    2019-08-10 [1] CRAN (R 3.5.3)
##  glue           1.3.1    2019-03-12 [1] CRAN (R 3.5.3)
##  gtable         0.3.0    2019-03-25 [1] CRAN (R 3.5.3)
##  hms            0.5.0    2019-07-09 [1] CRAN (R 3.5.3)
##  labeling       0.3      2014-08-23 [1] CRAN (R 3.5.0)
##  lattice        0.20-38  2018-11-04 [2] CRAN (R 3.5.3)
##  lazyeval       0.2.2    2019-03-15 [1] CRAN (R 3.5.3)
##  magrittr       1.5      2014-11-22 [1] CRAN (R 3.5.1)
##  MASS           7.3-51.1 2018-11-01 [2] CRAN (R 3.5.3)
##  Matrix         1.2-17   2019-03-22 [1] CRAN (R 3.5.3)
##  mgcv           1.8-28   2019-03-21 [1] CRAN (R 3.5.3)
##  munsell        0.5.0    2018-06-12 [1] CRAN (R 3.5.1)
##  nlme           3.1-137  2018-04-07 [2] CRAN (R 3.5.3)
##  pillar         1.4.2    2019-06-29 [1] CRAN (R 3.5.3)
##  pkgconfig      2.0.2    2018-08-16 [1] CRAN (R 3.5.1)
##  plogr          0.2.0    2018-03-25 [1] CRAN (R 3.5.1)
##  plyr           1.8.4    2016-06-08 [1] CRAN (R 3.5.1)
##  purrr          0.3.2    2019-03-15 [1] CRAN (R 3.5.3)
##  R6             2.4.0    2019-02-14 [1] CRAN (R 3.5.2)
##  RColorBrewer   1.1-2    2014-12-07 [1] CRAN (R 3.5.0)
##  Rcpp           1.0.2    2019-07-25 [1] CRAN (R 3.5.3)
##  readr        * 1.3.1    2018-12-21 [1] CRAN (R 3.5.2)
##  reshape2       1.4.3    2017-12-11 [1] CRAN (R 3.5.1)
##  rlang          0.4.0    2019-06-25 [1] CRAN (R 3.5.3)
##  scales         1.0.0    2018-08-09 [1] CRAN (R 3.5.1)
##  stringi        1.4.3    2019-03-12 [1] CRAN (R 3.5.3)
##  stringr        1.4.0    2019-02-10 [1] CRAN (R 3.5.2)
##  tibble         2.1.3    2019-06-06 [1] CRAN (R 3.5.3)
##  tidyselect     0.2.5    2018-10-11 [1] CRAN (R 3.5.1)
##  utf8           1.1.4    2018-05-24 [1] CRAN (R 3.5.1)
##  vctrs          0.2.0    2019-07-05 [1] CRAN (R 3.5.3)
##  viridisLite    0.3.0    2018-02-01 [1] CRAN (R 3.5.1)
##  withr          2.1.2    2018-03-15 [1] CRAN (R 3.5.1)
##  zeallot        0.1.0    2018-01-28 [1] CRAN (R 3.5.2)
## 
## [1] C:/Users/Italo/Documents/R/win-library/3.5
## [2] C:/Program Files/R/R-3.5.3/library