Minicurso R - 2019
Minicurso R - 2019
1 tidyr, dplyr e ggplot2
São os pacotes de maior representatividade do conjunto pertencente ao tidyverse pois apenas com estes é possível: ajustar o conjunto de dados para o formato de interesse, manipular os dados (filtrar linhas, selecionar colunas, sumarizar informações, etc) e produzir visualizações. Estas etapas são consideradas as etapas mais trabalhosas e desgastantes do processo para análise de dados.
2 tidyr
O pacote dispõe de funções para formatação adequada dos dados para análise. Tem como principais funções:
- gather() - empilha.
- spread() - desempilha.
- separate() - separar caracteres.
- unite() - unir caracteres.
- drop_na() - retirar dados ausentes.
- replace_na() - substituir dados ausentes.
2.1 gather() e spread()
São as funções do tidyr para empilhar e desempilhar os dados. É comum, em situações em que os dados são coletados ao longo do tempo, que cada coluna represente uma coleta. No formato ideal, espera-se que haja uma variável categórica que marque a ordem de coleta e uma variável com os valores observados na coleta. Sendo assim, a gather() e spread() tem como funcionalidade empilhar e desempilhar dados conforme a necessidade do usuário.
library(tidyverse)
## -- Attaching packages ---------------------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.1 v purrr 0.3.2
## v tibble 2.1.1 v dplyr 0.8.0.1
## v tidyr 0.8.3 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## -- Conflicts ------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
td <- tibble(
id = rep(1:50),
jan = rnorm(50, rpois(1,(runif(1)*10))),
fev = rnorm(50, rpois(1,(runif(1)*10))),
mar = rnorm(50, rpois(1,(runif(1)*10))),
abr = rnorm(50, rpois(1,(runif(1)*10))),
mai = rnorm(50, rpois(1,(runif(1)*10))),
jun = rnorm(50, rpois(1,(runif(1)*10))),
jul = rnorm(50, rpois(1,(runif(1)*10))),
ago = rnorm(50, rpois(1,(runif(1)*10))),
set = rnorm(50, rpois(1,(runif(1)*10))),
out = rnorm(50, rpois(1,(runif(1)*10))),
nov = rnorm(50, rpois(1,(runif(1)*10))),
dez = rnorm(50, rpois(1,(runif(1)*10))))
td
## # A tibble: 50 x 13
## id jan fev mar abr mai jun jul ago set out
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 6.15 -0.572 1.07 8.02 -0.720 9.33 2.21 7.92 -3.16 7.76
## 2 2 5.44 1.52 -0.368 8.89 0.884 8.17 1.29 7.79 -1.29 6.06
## 3 3 3.88 -0.359 0.779 9.19 1.41 7.01 1.03 8.51 -0.424 5.76
## 4 4 4.88 -0.187 0.397 9.12 0.715 7.13 1.53 8.73 0.116 5.91
## 5 5 5.14 0.401 0.490 9.75 -0.291 8.88 3.29 7.61 0.459 6.04
## 6 6 3.54 0.686 0.364 9.58 -0.231 8.05 2.58 7.90 0.689 5.65
## 7 7 4.55 -0.687 -0.216 9.43 0.377 7.86 1.76 8.29 0.595 5.52
## 8 8 5.12 0.608 1.32 9.63 0.814 8.45 2.34 8.47 0.863 7.90
## 9 9 2.72 0.451 0.0844 8.23 -0.883 8.89 5.00 9.11 -1.07 6.64
## 10 10 4.41 0.833 -1.75 9.44 -0.224 8.27 1.09 7.78 0.847 7.02
## # ... with 40 more rows, and 2 more variables: nov <dbl>, dez <dbl>
td_gat <- td %>% gather(key = 'mes', value = 'valor', jan:dez)
td_gat
## # A tibble: 600 x 3
## id mes valor
## <int> <chr> <dbl>
## 1 1 jan 6.15
## 2 2 jan 5.44
## 3 3 jan 3.88
## 4 4 jan 4.88
## 5 5 jan 5.14
## 6 6 jan 3.54
## 7 7 jan 4.55
## 8 8 jan 5.12
## 9 9 jan 2.72
## 10 10 jan 4.41
## # ... with 590 more rows
td_gat %>% spread(key=mes, value = valor)
## # A tibble: 50 x 13
## id abr ago dez fev jan jul jun mai mar nov
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 8.02 7.92 13.2 -0.572 6.15 2.21 9.33 -0.720 1.07 6.17
## 2 2 8.89 7.79 13.8 1.52 5.44 1.29 8.17 0.884 -0.368 6.57
## 3 3 9.19 8.51 12.9 -0.359 3.88 1.03 7.01 1.41 0.779 6.60
## 4 4 9.12 8.73 13.3 -0.187 4.88 1.53 7.13 0.715 0.397 4.14
## 5 5 9.75 7.61 11.3 0.401 5.14 3.29 8.88 -0.291 0.490 6.81
## 6 6 9.58 7.90 13.7 0.686 3.54 2.58 8.05 -0.231 0.364 5.56
## 7 7 9.43 8.29 12.4 -0.687 4.55 1.76 7.86 0.377 -0.216 6.37
## 8 8 9.63 8.47 10.7 0.608 5.12 2.34 8.45 0.814 1.32 6.78
## 9 9 8.23 9.11 12.9 0.451 2.72 5.00 8.89 -0.883 0.0844 6.61
## 10 10 9.44 7.78 11.9 0.833 4.41 1.09 8.27 -0.224 -1.75 6.38
## # ... with 40 more rows, and 2 more variables: out <dbl>, set <dbl>
2.2 separate() e unite()
As funções separate() e unite() servem para manipulações simples de strings em um tibble. Servem para unir ou separar strings utilizando um delimitador.
td2 <- tibble(nome = c("Lineu Alberto", "João Matheus", "PET Estatística"))
td2
## # A tibble: 3 x 1
## nome
## <chr>
## 1 Lineu Alberto
## 2 João Matheus
## 3 PET Estatística
td3 <- td2 %>% separate(col = 'nome',
into = c('primeiro_nome', 'segundo_nome'),
sep = ' ')
td3
## # A tibble: 3 x 2
## primeiro_nome segundo_nome
## <chr> <chr>
## 1 Lineu Alberto
## 2 João Matheus
## 3 PET Estatística
td3 %>% unite(col = 'nome',
sep = ' ')
## # A tibble: 3 x 1
## nome
## <chr>
## 1 Lineu Alberto
## 2 João Matheus
## 3 PET Estatística
2.3 drop_na() e replace_na()
As funções drop_na() e replace_na() servem para tratamento de dados ausentes (missing data).
td4 <- tibble(col1 = 1:10, col2 = c(1,2,NA,4,NA,6,7,NA,9,10))
td4
## # A tibble: 10 x 2
## col1 col2
## <int> <dbl>
## 1 1 1
## 2 2 2
## 3 3 NA
## 4 4 4
## 5 5 NA
## 6 6 6
## 7 7 7
## 8 8 NA
## 9 9 9
## 10 10 10
td4 %>% drop_na()
## # A tibble: 7 x 2
## col1 col2
## <int> <dbl>
## 1 1 1
## 2 2 2
## 3 4 4
## 4 6 6
## 5 7 7
## 6 9 9
## 7 10 10
td4 %>% replace_na(list(col2 = 0))
## # A tibble: 10 x 2
## col1 col2
## <int> <dbl>
## 1 1 1
## 2 2 2
## 3 3 0
## 4 4 4
## 5 5 0
## 6 6 6
## 7 7 7
## 8 8 0
## 9 9 9
## 10 10 10
3 dplyr
O dplyr é o pacote tidyverse destinado à manipulação e sumarização. Ele torna as atividades de manipulação menos custosas devido à sintaxe centralizada das funções. Tem como principais funções:
- filter() - filtra linhas.
- select() - seleciona colunas.
- arrange() - ordena a base.
- mutate() - cria/modifica colunas.
- group_by() - agrupa a base.
- summarise() - sumariza a base.
swiss$names <- rownames(swiss)
dados <- swiss %>% as_tibble()
names(dados)
## [1] "Fertility" "Agriculture" "Examination"
## [4] "Education" "Catholic" "Infant.Mortality"
## [7] "names"
dados
## # A tibble: 47 x 7
## Fertility Agriculture Examination Education Catholic Infant.Mortality
## <dbl> <dbl> <int> <int> <dbl> <dbl>
## 1 80.2 17 15 12 9.96 22.2
## 2 83.1 45.1 6 9 84.8 22.2
## 3 92.5 39.7 5 5 93.4 20.2
## 4 85.8 36.5 12 7 33.8 20.3
## 5 76.9 43.5 17 15 5.16 20.6
## 6 76.1 35.3 9 7 90.6 26.6
## 7 83.8 70.2 16 7 92.8 23.6
## 8 92.4 67.8 14 8 97.2 24.9
## 9 82.4 53.3 12 7 97.7 21
## 10 82.9 45.2 16 13 91.4 24.4
## # ... with 37 more rows, and 1 more variable: names <chr>
3.1 filter()
filtro1 <- dados %>% filter(Fertility > 70)
filtro2 <- dados %>% filter(Examination > 12 & Agriculture > 30)
filtro3 <- dados %>% filter(Examination > 12 | Agriculture < 30)
filtro4 <- dados %>% filter(names %in% c("Courtelary", "Delemont", "Franches-Mnt"))
3.2 select
names(dados)
## [1] "Fertility" "Agriculture" "Examination"
## [4] "Education" "Catholic" "Infant.Mortality"
## [7] "names"
select1 <- dados %>% select(names, Education)
names(select1)
## [1] "names" "Education"
select2 <- dados %>% select(starts_with("e"))
names(select2)
## [1] "Examination" "Education"
select3 <- dados %>% select(Fertility, Agriculture:Education)
names(select3)
## [1] "Fertility" "Agriculture" "Examination" "Education"
select4 <- dados %>% select(-Fertility, -names)
names(select4)
## [1] "Agriculture" "Examination" "Education"
## [4] "Catholic" "Infant.Mortality"
3.3 arrange
df <- letters %>% as_tibble()
## Warning: Calling `as_tibble()` on a vector is discouraged, because the behavior is likely to change in the future. Use `tibble::enframe(name = NULL)` instead.
## This warning is displayed once per session.
df$value
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
df2 <- df %>% arrange(desc(value))
df2$value
## [1] "z" "y" "x" "w" "v" "u" "t" "s" "r" "q" "p" "o" "n" "m" "l" "k" "j"
## [18] "i" "h" "g" "f" "e" "d" "c" "b" "a"
df3 <- df2 %>% arrange(value)
df3$value
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
3.4 mutate
df2 <- tibble(col1 = rnorm(50), col2 = rpois(50, 1))
df2
## # A tibble: 50 x 2
## col1 col2
## <dbl> <int>
## 1 1.93 1
## 2 0.125 1
## 3 -0.0771 2
## 4 -0.792 1
## 5 0.111 0
## 6 1.08 1
## 7 -0.527 0
## 8 0.904 0
## 9 1.09 1
## 10 1.82 1
## # ... with 40 more rows
mutate1 <- df2 %>% mutate(col2 = letters[1:10] %>% rep(5))
mutate1
## # A tibble: 50 x 2
## col1 col2
## <dbl> <chr>
## 1 1.93 a
## 2 0.125 b
## 3 -0.0771 c
## 4 -0.792 d
## 5 0.111 e
## 6 1.08 f
## 7 -0.527 g
## 8 0.904 h
## 9 1.09 i
## 10 1.82 j
## # ... with 40 more rows
mutate2 <- df2 %>% mutate(col3 = 1:nrow(df2))
mutate2
## # A tibble: 50 x 3
## col1 col2 col3
## <dbl> <int> <int>
## 1 1.93 1 1
## 2 0.125 1 2
## 3 -0.0771 2 3
## 4 -0.792 1 4
## 5 0.111 0 5
## 6 1.08 1 6
## 7 -0.527 0 7
## 8 0.904 0 8
## 9 1.09 1 9
## 10 1.82 1 10
## # ... with 40 more rows
mutate3 <- df2 %>% mutate( col3 = col1 + col2,
col4 = 1:nrow(df2),
col5 = col1 * 10)
mutate3
## # A tibble: 50 x 5
## col1 col2 col3 col4 col5
## <dbl> <int> <dbl> <int> <dbl>
## 1 1.93 1 2.93 1 19.3
## 2 0.125 1 1.12 2 1.25
## 3 -0.0771 2 1.92 3 -0.771
## 4 -0.792 1 0.208 4 -7.92
## 5 0.111 0 0.111 5 1.11
## 6 1.08 1 2.08 6 10.8
## 7 -0.527 0 -0.527 7 -5.27
## 8 0.904 0 0.904 8 9.04
## 9 1.09 1 2.09 9 10.9
## 10 1.82 1 2.82 10 18.2
## # ... with 40 more rows
3.5 summarise e group_by
dados
## # A tibble: 47 x 7
## Fertility Agriculture Examination Education Catholic Infant.Mortality
## <dbl> <dbl> <int> <int> <dbl> <dbl>
## 1 80.2 17 15 12 9.96 22.2
## 2 83.1 45.1 6 9 84.8 22.2
## 3 92.5 39.7 5 5 93.4 20.2
## 4 85.8 36.5 12 7 33.8 20.3
## 5 76.9 43.5 17 15 5.16 20.6
## 6 76.1 35.3 9 7 90.6 26.6
## 7 83.8 70.2 16 7 92.8 23.6
## 8 92.4 67.8 14 8 97.2 24.9
## 9 82.4 53.3 12 7 97.7 21
## 10 82.9 45.2 16 13 91.4 24.4
## # ... with 37 more rows, and 1 more variable: names <chr>
dados %>%
summarise(mean_fert = mean(Fertility))
## # A tibble: 1 x 1
## mean_fert
## <dbl>
## 1 70.1
dados %>%
summarise(
media_fert = mean(Fertility),
mediana_fert = median(Fertility))
## # A tibble: 1 x 2
## media_fert mediana_fert
## <dbl> <dbl>
## 1 70.1 70.4
dados %>%
group_by(names) %>%
summarise(mean_fert = mean(Fertility))
## # A tibble: 47 x 2
## names mean_fert
## <chr> <dbl>
## 1 Aigle 64.1
## 2 Aubonne 66.9
## 3 Avenches 68.9
## 4 Boudry 70.4
## 5 Broye 83.8
## 6 Conthey 75.5
## 7 Cossonay 61.7
## 8 Courtelary 80.2
## 9 Delemont 83.1
## 10 Echallens 68.3
## # ... with 37 more rows
df2%>%
group_by(col2) %>%
summarise(mean_col1 = mean(col1))
## # A tibble: 4 x 2
## col2 mean_col1
## <int> <dbl>
## 1 0 0.417
## 2 1 0.0901
## 3 2 0.354
## 4 3 -0.330
3.6 sample_n e sample_frac
dados %>% sample_n(10)
## # A tibble: 10 x 7
## Fertility Agriculture Examination Education Catholic Infant.Mortality
## <dbl> <dbl> <int> <int> <dbl> <dbl>
## 1 76.9 43.5 17 15 5.16 20.6
## 2 44.7 46.6 16 29 50.4 18.2
## 3 71.7 34 17 8 3.3 20
## 4 74.2 58.1 14 8 5.23 23.8
## 5 60.5 60.8 16 10 7.72 16.3
## 6 75.5 85.9 3 2 99.7 15.1
## 7 72 63.5 6 3 2.56 18
## 8 55.7 19.4 26 28 12.1 20.2
## 9 56.6 50.9 22 12 15.1 16.7
## 10 69.3 84.9 7 6 99.7 19.8
## # ... with 1 more variable: names <chr>
dados %>% sample_frac(0.1)
## # A tibble: 5 x 7
## Fertility Agriculture Examination Education Catholic Infant.Mortality
## <dbl> <dbl> <int> <int> <dbl> <dbl>
## 1 55.7 19.4 26 28 12.1 20.2
## 2 92.2 84.6 3 3 99.5 16.3
## 3 79.4 64.9 7 3 98.2 20.2
## 4 60.5 60.8 16 10 7.72 16.3
## 5 56.6 50.9 22 12 15.1 16.7
## # ... with 1 more variable: names <chr>
3.7 joins
3.7.1 inner_join
As funções do tipo join servem para cruzar bases por uma coluna chave. Na inner_join() gera um novo conjunto de dados apenas para os casos em que a chave é verificada nos dois arquivos. A full_join() une todas as linhas e todas as colunas, independente da chave ocorrer nos dois arquivos. Nos casos em que não há correspondência é gerado NA. Na left_join() todas as chaves do primeiro arquivo são mantidas e acrescenta-se valores nos casos em que há compatibilidade de chave. As chaves que são observadas apenas no segundo conjunto de dados são descartados. No right_join() todas as chaves do segundo arquivo são mantidas e acrescenta-se valores nos casos em que há compatibilidade de chave. As chaves que são observadas apenas no primeiro conjunto de dados são descartados.
tb1 <- tibble(codigo = c("001", "002", "003", "004", "005",
"006", "007", "008", "009", "010"),
ocorrencia = rbinom(10,1, prob = 0.5),
n = rpois(10,2))
tb1
## # A tibble: 10 x 3
## codigo ocorrencia n
## <chr> <int> <int>
## 1 001 1 1
## 2 002 1 1
## 3 003 0 1
## 4 004 1 2
## 5 005 1 3
## 6 006 0 0
## 7 007 1 3
## 8 008 0 0
## 9 009 0 2
## 10 010 1 1
tb2 <- tibble(code = c("001", "022", "003", "004", "005",
"000", "007", "018", "079", "010"),
year = c(2010, 2011, 2015, 1999, 2000,
1996, 1998, 1955, 1971, 2001))
tb2
## # A tibble: 10 x 2
## code year
## <chr> <dbl>
## 1 001 2010
## 2 022 2011
## 3 003 2015
## 4 004 1999
## 5 005 2000
## 6 000 1996
## 7 007 1998
## 8 018 1955
## 9 079 1971
## 10 010 2001
inner_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 6 x 4
## codigo ocorrencia n year
## <chr> <int> <int> <dbl>
## 1 001 1 1 2010
## 2 003 0 1 2015
## 3 004 1 2 1999
## 4 005 1 3 2000
## 5 007 1 3 1998
## 6 010 1 1 2001
full_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 14 x 4
## codigo ocorrencia n year
## <chr> <int> <int> <dbl>
## 1 001 1 1 2010
## 2 002 1 1 NA
## 3 003 0 1 2015
## 4 004 1 2 1999
## 5 005 1 3 2000
## 6 006 0 0 NA
## 7 007 1 3 1998
## 8 008 0 0 NA
## 9 009 0 2 NA
## 10 010 1 1 2001
## 11 022 NA NA 2011
## 12 000 NA NA 1996
## 13 018 NA NA 1955
## 14 079 NA NA 1971
left_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 10 x 4
## codigo ocorrencia n year
## <chr> <int> <int> <dbl>
## 1 001 1 1 2010
## 2 002 1 1 NA
## 3 003 0 1 2015
## 4 004 1 2 1999
## 5 005 1 3 2000
## 6 006 0 0 NA
## 7 007 1 3 1998
## 8 008 0 0 NA
## 9 009 0 2 NA
## 10 010 1 1 2001
right_join(tb1, tb2, by = c("codigo"="code"))
## # A tibble: 10 x 4
## codigo ocorrencia n year
## <chr> <int> <int> <dbl>
## 1 001 1 1 2010
## 2 022 NA NA 2011
## 3 003 0 1 2015
## 4 004 1 2 1999
## 5 005 1 3 2000
## 6 000 NA NA 1996
## 7 007 1 3 1998
## 8 018 NA NA 1955
## 9 079 NA NA 1971
## 10 010 1 1 2001
4 ggplot2
Antes de falar sobre o pacote ggplot2
, é importante definir alguns conceitos. Quando finalizamos as etapas de formatação (tidyr) e manipulação (dplyr) dos dados, podemos criar estatísticas e visualizações a partir dos mesmos. Mas o que é Visualização de Dados?
- Visualização de Dados é a representação de dados em formato gráfico.
Mas o que é um gráfico?
- O gráfico é uma representação com forma geométrica e que é construída a partir de informações obtidas dos dados.
Isso significa que o gráfico é um desenho que tem dimensões, forma, tamanho, comprimento, area, volume, etc.
Agora que o conceito está definido, podemos trabalhar com as visualizações de dados com ggplot2.
Para fazer visualizações no ggplot2 utilizaremos o dataset tips
do pacote reshape2
. Essa base de dados foi escolhida pois contém variáveis qualitativas e quantitativas.
data(tips, package = 'reshape2') ## Carregando os dados
str(tips) ## Estrutura da base de dados
## 'data.frame': 244 obs. of 7 variables:
## $ total_bill: num 17 10.3 21 23.7 24.6 ...
## $ tip : num 1.01 1.66 3.5 3.31 3.61 4.71 2 3.12 1.96 3.23 ...
## $ sex : Factor w/ 2 levels "Female","Male": 1 2 2 2 1 2 2 2 2 2 ...
## $ smoker : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ day : Factor w/ 4 levels "Fri","Sat","Sun",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ time : Factor w/ 2 levels "Dinner","Lunch": 1 1 1 1 1 1 1 1 1 1 ...
## $ size : int 2 3 3 2 4 4 2 4 2 2 ...
head(tips) ## Seis primeiras linhas
## total_bill tip sex smoker day time size
## 1 16.99 1.01 Female No Sun Dinner 2
## 2 10.34 1.66 Male No Sun Dinner 3
## 3 21.01 3.50 Male No Sun Dinner 3
## 4 23.68 3.31 Male No Sun Dinner 2
## 5 24.59 3.61 Female No Sun Dinner 4
## 6 25.29 4.71 Male No Sun Dinner 4
summary(tips) ## Calcula estatísticas
## total_bill tip sex smoker day
## Min. : 3.07 Min. : 1.000 Female: 87 No :151 Fri :19
## 1st Qu.:13.35 1st Qu.: 2.000 Male :157 Yes: 93 Sat :87
## Median :17.80 Median : 2.900 Sun :76
## Mean :19.79 Mean : 2.998 Thur:62
## 3rd Qu.:24.13 3rd Qu.: 3.562
## Max. :50.81 Max. :10.000
## time size
## Dinner:176 Min. :1.00
## Lunch : 68 1st Qu.:2.00
## Median :2.00
## Mean :2.57
## 3rd Qu.:3.00
## Max. :6.00
A estrutura padrão dos gráficos em ggplot2 segue a forma:
ggplot(data = <“DADOS”>, mapping = aes(<“MAPEAMENTO DAS VARIÁVEIS”>)) + <“GEOM_FUNÇÃO”>()
A componente <DADOS>
deve ser utilizada para importar os dados (geralmente de um data.frame). Já a componente <MAPEAMENTO DAS VARIÁVEIS>
deve ser utilizada para estabelecer se alguma variável irá aparecer no eixo x
ou y
. Essa também pode ser utilizada por outras variáveis que serão representadas por cores, tamanhos ou formas diferentes. Para selecionar o tipo de gráfico que será plotado, deve-se usar as funções com prefixo geom
. A lista com os diferentes tipos de funções com prefixo geom
está logo abaixo.
## [1] "geom_abline" "geom_area" "geom_bar"
## [4] "geom_bin2d" "geom_blank" "geom_boxplot"
## [7] "geom_col" "geom_contour" "geom_count"
## [10] "geom_crossbar" "geom_curve" "geom_density"
## [13] "geom_density_2d" "geom_density2d" "geom_dotplot"
## [16] "geom_errorbar" "geom_errorbarh" "geom_freqpoly"
## [19] "geom_hex" "geom_histogram" "geom_hline"
## [22] "geom_jitter" "geom_label" "geom_line"
## [25] "geom_linerange" "geom_map" "geom_path"
## [28] "geom_point" "geom_pointrange" "geom_polygon"
## [31] "geom_qq" "geom_qq_line" "geom_quantile"
## [34] "geom_raster" "geom_rect" "geom_ribbon"
## [37] "geom_rug" "geom_segment" "geom_sf"
## [40] "geom_sf_label" "geom_sf_text" "geom_smooth"
## [43] "geom_spoke" "geom_step" "geom_text"
## [46] "geom_tile" "geom_violin" "geom_vline"
## [49] "update_geom_defaults"
4.1 Construção dos Gráficos
Para a construção do primeiro gráfico, escolhemos a variável total_bill
.
g2 <- ggplot(mapping = aes(x = total_bill), data = tips) # Mapeamento
g2
Perceba como essa primeira parte da construção do gráfico não está utilizando a componente <GEOM_FUNÇÃO>
. Somente está sendo delimitado que a variável total_bill
irá aparecer no eixo x
. Por conta disso, nenhum gráfico foi plotado.
4.1.1 Histograma
Para a construção de um histograma, basta acrescentar ao mapeamento armazenado no objeto g2 a função geom_histogram()
. No exemplo abaixo, três elementos adicionais foram acrescentados a função geom_histogram
, sendo:
col: Cor de Contorno
fill: Cor de Preenchimento
alpha: Quantidade Desejada de Transparência
g3 <- geom_histogram(col='gray50',fill=3,alpha=0.8) # Estrutura
g2 + g3
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Além desses elementos mencionados, também é possível adicionar outros elementos específicos para cada tipo de geom
. Como exemplo, o argumento bins
da geom_histogram
que controla o número de barras será alterado.
g3 <- geom_histogram(col='gray50',fill=3,alpha=0.8,bins=8)
g2 + g3
Como curiosidade, também foi adicionada a função geom_rug()
.
g2 + g3 + geom_rug()
4.1.2 Densidade
Para construir um gráfico de densidade no ggplot2
, basta adicionar a função geom_density
à estrutura mapeada anteriormente. Novamente, adicionamos a função geom_rug
foi adicionada como curiosidade
g3 <- geom_density(col='red',fill='blue',alpha=0.3)
g2 + g3
g2 + g3 + geom_rug(col=2)
4.1.3 Boxplot
Pensando em análise univariada (uma variável), também é possível criar boxplots pelo pacote. Entretanto, o mapeamento deve ser alterado do eixo x
(que foi utilizado no histograma e no gráfico de densidade) para o eixo y
. Por conta disso, a função ggplot
foi utilizada novamente.
g2 <- ggplot(mapping = aes(y = total_bill), data = tips)
g3 <- geom_boxplot(col=4, fill=3, alpha=0.4)
g2 + g3
Quando o assunto é análise bivariada (duas variáveis), podemos adicionar uma nova variável no eixo x
e fazer um boxplot para cada nível dessa variável.
g2 <- ggplot(aes(x = smoker, y = total_bill), data = tips)
g3 <- geom_boxplot()
g2+g3
Também podemos modificar as cores de contorno ou de preenchimento por essa mesma variável.
g2 <- ggplot(aes(x = smoker, y = total_bill, col=smoker), data = tips)
g3 <- geom_boxplot()
g2+g3
g2 <- ggplot(aes(x = smoker, y = total_bill, fill=smoker), data = tips)
g3 <- geom_boxplot()
g2+g3
4.1.4 Gráfico de Barras
Um gráfico de barras pode ser utilizado quando desejamos observar as frequências absolutas ou frequências relativas de um conjunto de dados. Entretanto, esse tipo de gráfico necessita de um mapeamento com pelo menos duas variáveis, sendo uma no eixo x
(Variável sendo observada) e outra no eixo y
(Frequência Absoluta ou Frequência Relativa)
tips_auxiliar <- as.data.frame(table(tips$size))
colnames(tips_auxiliar) <- c("size","Contagem")
g2 <- ggplot(mapping = aes(x = size, y=Contagem), data = tips_auxiliar)
g3 <- geom_col(fill='gray50')
g2+g3
Adicionalmente, a função coord_flip()
pode ser utilizada para alternar os eixos do gráfico.
g2+g3 + coord_flip()
4.1.5 Gráfico de Setores
Para a criação de um gráfico de setores, inicialmente é necessário que um gráfico de coluna empilhada seja criado.
g2 <- ggplot(tips_auxiliar, aes(x="", y=Contagem, fill=size))
g3 <- geom_bar(stat = "identity")
g2+g3
Adicionalmente a esse gráfico, deve-se alterar a coordenada do eixo y
com a função coord_polar("y", start=0)
.
g6 <- coord_polar("y", start=0) # Coordenada
g2+g3+g6
4.1.6 Gráfico de Dispersão
Agora pensando em duas variáveis, também é possível criar um gráfico de dispersão. O comando geom_point()
deve ser utilizado para a criação desse gráfico.
g2 <- ggplot(aes(x = total_bill, y = tip), data = tips)
g3 <- geom_point()
g2+g3
Também é possível mapear uma variável categórica à cor dos pontos. Isso é muito útil quando deseja-se comparar um ou mais grupos.
g2 <- ggplot(aes(x = total_bill, y = tip, col=sex), data = tips)
g3 <- geom_point()
g2+g3
Também podemos mapear uma variável contínua à cor dos pontos.
ggplot(tips, aes(x = size, y = tip, colour = total_bill)) + geom_point()
Uma outra possibilidade é ajustar um modelo de regressão linear geral ou por grupo.
g5 <- geom_smooth(method = 'lm', col=4)
g2+g3+g5
g5 <- geom_smooth(aes(group=sex),method = 'lm',se=F)
g2+g3+g5
4.2 Explorando as outras camadas
4.2.1 Alterando os eixos e título
Assim como é feito nos gráficos do pacote básico do R, também podemos alterar os nomes dos eixos, nome do título e posição do título com as funções xlab
, ylab
, ggtitle
e theme(plot.title = element_text(hjust = 'posição'))
respectivamente. A posição
deste último varia entre 0 e 1, sendo 0.5 o valor do meio.
g2 <- ggplot(mapping = aes(x = total_bill), data = tips)
g3 <- geom_histogram(col='gray50',fill=3,bins=8)
g2+g3
g2+g3 + xlab("Total da Conta") + ylab("Frequência") +
ggtitle("Histograma - Total da Conta") +
theme(plot.title = element_text(hjust = 0.5)) # Centraliza o título
4.2.2 Legendas
Quando temos um gráfico com legenda, também podemos modificar o nome do título e sua posição com as funções labs
e theme(legend.position = "posição")
. As posições mais utilizadas são: ‘left’, ‘right’,‘bottom’,‘top’.
g2 <- ggplot(aes(x = smoker, y = total_bill, fill=smoker), data = tips)
g3 <- geom_boxplot()
g2+g3
g2+g3 + labs(fill = "Fumante")
g2+g3 + labs(fill = "Fumante") + theme(legend.position = "top")
4.2.3 Facets
A função facet_wrap
possibilita a criação de gráficos em que faz-se a distinção entre os níveis de um fator.
g2 <- ggplot(aes(x = total_bill, y = tip, col=sex), data = tips)
g3 <- geom_point()
g2+g3+facet_grid(smoker~.)
g2+g3+facet_grid(.~smoker)
4.2.4 Modificando Temas
O ggplot2
também tem funções que permitem modificar os temas do gráfico. Para modificar o tema, basta acrescentar ao gráfico a função theme_(nome_do_tema)
.
## [1] "theme_bw" "theme_classic" "theme_dark" "theme_get"
## [5] "theme_gray" "theme_grey" "theme_light" "theme_linedraw"
## [9] "theme_minimal" "theme_replace" "theme_set" "theme_test"
## [13] "theme_update" "theme_void"
x1 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_gray() + ggtitle('theme_gray')
x2 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_bw() + ggtitle('theme_bw')
x3 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_minimal() + ggtitle('theme_minimal')
x4 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_get() + ggtitle('theme_get')
x5 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_test() + ggtitle('theme_test')
x6 <- ggplot(aes(x = total_bill, y = tip), data = tips) + theme_light() + ggtitle('theme_light')
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
4.2.5 Gráficos em Painel
Quando queremos adicionar vários gráficos em um mesmo painel nos pacotes básicos do R, utilizamos a função par(mfrow=c())
. Entretanto, isso não é possível de ser realizado no pacote ggplot2
. Para que isso seja possível, devemos utilizar a função grid.arrange
da função gridExtra
. Para isso, quatro gráficos foram armazenados.
grafico1 <- ggplot(aes(x = total_bill, y = tip, col=sex), data = tips) +
geom_point() +
geom_smooth(method = 'lm', col=4)
grafico2 <- data.frame(y=rnorm(1000)) %>%
ggplot(data=., mapping = aes(x=y)) +
geom_density(col=4, fill=2, alpha=0.3)
grafico3 <- ggplot(data=mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~manufacturer)
grafico4 <- plot_result
grid.arrange(grafico1,grafico2,grafico3,grafico4,
nrow=2,ncol=2)
5 Gráficos Interativos
Além dos gráficos estáticos gerados pelo ggplot2
, é possível converter esses gráficos para gráficos interativos com o uso da função ggplotly
do pacote plotly
.
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
ggplotly(grafico1)
ggplotly(grafico2)
ggplotly(grafico3)
ggplotly(grafico4)