Os gráficos que explicam nossos dados (boxplot)
Nossos dados merecem ser apresentados de forma clara, atraente e inspiradora. Não há nada mais frustrante que dar duro no campo para coletar os dados e depois apresentá-los numa simples tabela de resumos. Podemos e devemos fazer mais, certo?
Vou começar agora uma série de posts sobre tipos de gráficos. Como disse no primeiro post desse blog, minha intenção é documentar os scripts que escrevi durante a graduação, portanto os gráficos que vou apresentar se resumem aos que tive de fazer por conta de alguma demanda específica.
Para iniciar, escolhi o gráfico boxplot. É um gráfico muito útil para entender a variabilidade das nossas observações. No boxplot temos 5 informações básicas: valor mínimo, primeiro quartil, mediana, terceiro quartil e valor máximo. Há ainda a notificação de outliers, quando a observação é maior ou menor que 1,5 vezes a distância interquartílica.
Vamos trabalhar com os dados que apresentei no post anterior sobre tidy data.
library(pacman)
p_load(readr, dplyr, tidyr, ggplot2, ggthemes)
dados <- read_csv2(
"https://raw.githubusercontent.com/italocegatta/italocegatta.github.io_source/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
Primeiro vamos processar os dados da última medição (Coleta 5) para verificar o nº total de galhas de cada tratamento, desconsiderando o local da galha. Nesse caso estou considerando apenas as mudas que foram atacadas e tiveram o desenvolvimento de galhas.
# seleciona apenas as Coletas de numero 5, em seguida monta um fator de
# agrupamento em função de Tratamento e Individuo. Aplica a soma de todas as
# observações (Galhas) de acordo com o fator de agrupamento. Troca os valores
# 0 (quando não há galhas) por NA.
total <- dados %>%
filter(Coleta == 5) %>%
group_by(Tratamento, Individuo) %>%
summarise(Galhas = sum(Galhas, na.rm=T)) %>%
mutate(Galhas = replace(Galhas, Galhas == 0, NA))
total
## # A tibble: 140 x 3
## # Groups: Tratamento [7]
## Tratamento Individuo Galhas
## <chr> <dbl> <dbl>
## 1 Actara d1 1 11
## 2 Actara d1 2 NA
## 3 Actara d1 3 4
## 4 Actara d1 4 NA
## 5 Actara d1 5 NA
## 6 Actara d1 6 NA
## 7 Actara d1 7 30
## 8 Actara d1 8 NA
## 9 Actara d1 9 NA
## 10 Actara d1 10 NA
## # ... with 130 more rows
O boxplot é um gráfico unidimensional, ou seja, precisamos de apenas uma variável para construí-lo. Entretanto, podemos usar variáveis categóricas para servir de agrupamento e replicar o gráfico para todos os níveis da variável. Por exemplo, no nosso banco de dados temos Galhas
como variável quantitativa e Tratamento
, Coleta
e Local
como variável qualitativa.
ggplot(total, aes("Total", Galhas)) +
geom_boxplot(fill = "grey60", alpha = 0.8) +
theme_bw()
A Figura 1 dá uma visão geral de todas as observações em um único boxplot, mas não nos explica muita coisa. No caso da Figura 2, Tratamento
tratamento é uma variável categórica e nos permite subdividir os boxplots para todos os níveis e assim podemos compará-los.
ggplot(total, aes(Tratamento, Galhas)) +
geom_boxplot(fill = "grey60", alpha = 0.8) +
theme_bw(16)
Note que no tratamento Actara d1, há um indivíduo discrepante (outlier) que se destaca com 30 galhas. Note também a grande variabilidade entre os tratamentos, muito comum em experimentos envolvendo insetos. Normalmente o coeficiente de variação é extremamente alto e dificilmente há homogeneidade de variância. Um comentário interessante sobre o boxplot é que a caixa, valores entre o 1º e 3º quartil, corresponde a 50% das observações.
Podemos também avaliar a variabilidade do nº de galhas por local. Para isso vamos incluir a variável Local
no agrupamento (Figura 3).
# Adiciona mais um fator de agrupamento para o resumo. Nesse caso cada
# indivíduo terá o nº de galhas explicito em cada local.
local <- dados %>%
filter(Coleta == 5) %>%
group_by(Tratamento, Individuo, Local) %>%
summarise(Galhas = sum(Galhas, na.rm=T)) %>%
mutate(Galhas = replace(Galhas, Galhas == 0, NA))
local
## # A tibble: 420 x 4
## # Groups: Tratamento, Individuo [140]
## Tratamento Individuo Local Galhas
## <chr> <dbl> <chr> <dbl>
## 1 Actara d1 1 Caule 2
## 2 Actara d1 1 Nervura 3
## 3 Actara d1 1 Peciolo 6
## 4 Actara d1 2 Caule NA
## 5 Actara d1 2 Nervura NA
## 6 Actara d1 2 Peciolo NA
## 7 Actara d1 3 Caule 1
## 8 Actara d1 3 Nervura 1
## 9 Actara d1 3 Peciolo 2
## 10 Actara d1 4 Caule NA
## # ... with 410 more rows
ggplot(local, aes(Tratamento, Galhas, fill = Local)) +
geom_boxplot(alpha = 0.8) +
scale_fill_brewer(palette = "Spectral") +
theme_bw(16)
Uma outra perspectiva é avaliar a evolução do total de galhas por coleta. Para isto basta incluir a variável Coleta
no agrupamento (Figura 4). Para facilitar a visualização, vou excluir a primeira coleta. Podemos ainda adicionar os pontos que representam as observações para poder identificar quantas observações tem cada tratamento.
total_coleta <- dados %>%
filter(Coleta != 1 ) %>%
group_by(Tratamento, Coleta, Individuo) %>%
summarise(Galhas = sum(Galhas, na.rm=T)) %>%
mutate(Galhas = replace(Galhas, Galhas == 0, NA))
total_coleta
## # A tibble: 560 x 4
## # Groups: Tratamento, Coleta [28]
## Tratamento Coleta Individuo Galhas
## <chr> <dbl> <dbl> <dbl>
## 1 Actara d1 2 1 3
## 2 Actara d1 2 2 NA
## 3 Actara d1 2 3 NA
## 4 Actara d1 2 4 NA
## 5 Actara d1 2 5 NA
## 6 Actara d1 2 6 NA
## 7 Actara d1 2 7 2
## 8 Actara d1 2 8 NA
## 9 Actara d1 2 9 NA
## 10 Actara d1 2 10 NA
## # ... with 550 more rows
ggplot(total_coleta, aes(Tratamento, Galhas)) +
geom_boxplot(fill = "grey60", alpha = 0.8, outlier.color = NA) +
geom_jitter(alpha = 0.4) +
facet_wrap(~Coleta) +
theme_bw(16) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
É importante destacar que o gráfico da Figura 4 não é adequado para esse tipo de informação. Nesse caso seria mais interessante um gráfico de linhas em que cada linha representa um tratamento (veremos esse gráfico em um futuro post).
Caso tenha alguma dúvida ou sugestão sobre o post, fique à vontade para fazer um comentário ou me contatar por E-mail.
devtools::session_info()
## - 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)
## blogdown 0.14 2019-07-13 [1] CRAN (R 3.5.3)
## bookdown 0.12 2019-07-11 [1] CRAN (R 3.5.3)
## callr 3.3.1 2019-07-18 [1] CRAN (R 3.5.3)
## cli 1.1.0 2019-03-19 [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)
## curl 4.0 2019-07-22 [1] CRAN (R 3.5.3)
## desc 1.2.0 2018-05-01 [1] CRAN (R 3.5.1)
## devtools 2.1.0 2019-07-06 [1] CRAN (R 3.5.3)
## 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)
## evaluate 0.14 2019-05-28 [1] CRAN (R 3.5.3)
## fansi 0.4.0 2018-10-05 [1] CRAN (R 3.5.1)
## fs 1.3.1 2019-05-06 [1] CRAN (R 3.5.3)
## ggplot2 * 3.2.1 2019-08-10 [1] CRAN (R 3.5.3)
## ggthemes * 4.2.0 2019-05-13 [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)
## highr 0.8 2019-03-20 [1] CRAN (R 3.5.3)
## hms 0.5.0 2019-07-09 [1] CRAN (R 3.5.3)
## htmltools 0.3.6 2017-04-28 [1] CRAN (R 3.5.1)
## knitr 1.24 2019-08-08 [1] CRAN (R 3.5.3)
## labeling 0.3 2014-08-23 [1] CRAN (R 3.5.0)
## 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)
## memoise 1.1.0 2017-04-21 [1] CRAN (R 3.5.1)
## munsell 0.5.0 2018-06-12 [1] CRAN (R 3.5.1)
## pacman * 0.5.1 2019-03-11 [1] CRAN (R 3.5.3)
## pillar 1.4.2 2019-06-29 [1] CRAN (R 3.5.3)
## pkgbuild 1.0.4 2019-08-05 [1] CRAN (R 3.5.3)
## pkgconfig 2.0.2 2018-08-16 [1] CRAN (R 3.5.1)
## pkgload 1.0.2 2018-10-29 [1] CRAN (R 3.5.1)
## prettyunits 1.0.2 2015-07-13 [1] CRAN (R 3.5.1)
## processx 3.4.1 2019-07-18 [1] CRAN (R 3.5.3)
## ps 1.3.0 2018-12-21 [1] CRAN (R 3.5.2)
## 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)
## remotes 2.1.0 2019-06-24 [1] CRAN (R 3.5.3)
## rlang 0.4.0 2019-06-25 [1] CRAN (R 3.5.3)
## rmarkdown 1.14 2019-07-12 [1] CRAN (R 3.5.3)
## rprojroot 1.3-2 2018-01-03 [1] CRAN (R 3.5.1)
## scales 1.0.0 2018-08-09 [1] CRAN (R 3.5.1)
## sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.5.2)
## 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)
## testthat 2.2.1 2019-07-25 [1] CRAN (R 3.5.3)
## tibble 2.1.3 2019-06-06 [1] CRAN (R 3.5.3)
## tidyr * 0.8.3 2019-03-01 [1] CRAN (R 3.5.3)
## tidyselect 0.2.5 2018-10-11 [1] CRAN (R 3.5.1)
## usethis 1.5.1 2019-07-04 [1] CRAN (R 3.5.3)
## 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)
## withr 2.1.2 2018-03-15 [1] CRAN (R 3.5.1)
## xfun 0.8 2019-06-25 [1] CRAN (R 3.5.3)
## yaml 2.2.0 2018-07-25 [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