Os gráficos que explicam nossos dados (barras)
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)
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)
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)
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))
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)
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)
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)
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))
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)
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)
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))
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