###### Aula GGplot #coloque o comando setwd() abaixo ############################################################################# ###### INSTALANDO E CARREGANDO OS PACOTES QUE SERÃO UTILIZADOS ############################################################################# ## Pacote Tidyverse. Contém diversos pacotes com diversas funções para a manipulação dos dados #install.packages("tidyverse") # instalando o pacote / SE AINDA NÃO FOI INSTALADO, RETIRE A # DO ÍNICIO PARA CONSEGUIR RODAR library (tidyverse) # carregando o pacote install.packages("cowplot") #pacote para exportar imagens library(cowplot) ############################################################################# ###### VERIFICANDO SE VOCÊ JÁ INFORMOU AO R STUDIO QUAL É O DIRETÓRIO DE TRABALHO QUE ELE IRÁ CONSIDERAR PARA ACESSAR E SALVAR OS SEUS ARQUIVOS ############################################################################# # Ainda na aba “Files”, clique em “ More” (com ícone de engrenagem em azul) e depois em “Set As Working Directory” # Repare: no console, aparecerá o comando “setwd()”. Dentro dos parênteses deverá conter o caminho até a pasta que você escolheu # Para verificar qual o diretório de trabalho está sendo trabalhado, utilize a função: getwd() ############################################################################# ###### LIMPANDO OS OBJETOS DE OUTROS PROJETOS ############################################################################# ls() #Verificando se há objetos usando a função rm(list = ls()) # removendo os objetos ############################################################################# ###### CRIANDO UM BANCO DE DADOS ############################################################################# #Criando um banco de dados set.seed(123) # Define uma semente para geração de números aleatórios reproduzíveis df <- tibble( # Cria um novo tibble (data frame moderno) com as seguintes colunas: dia = 1:300, # Coluna "dia" de 1 a 300 notificados = round(seq(20, 500, length.out = 300)) + sample(-20:20, 300, replace = TRUE), # Coluna "notificados" com valores entre 20 e 500, com ruído aleatório confirmados = round(seq(5, 50, length.out = 300)) + sample(-5:5, 300, replace = TRUE), # Coluna "confirmados" com valores entre 5 e 50, com ruído aleatório sexo = sample(c('F', 'M'), 300, replace = TRUE, prob = c(.6, .4)), # Coluna "sexo" com valores 'F' e 'M', com probabilidade de 60% e 40%, respectivamente idade = sample(c(0:19, 20:39, 40:59, 60:100), 300, replace = TRUE), # Coluna "idade" com valores entre 0-19, 20-39, 40-59 e 60-100 de forma aleatória local = rep(c('Local1', 'Local2'), each = 150) # Coluna "local" com repetição de 'Local1' e 'Local2' para 150 vezes cada ) head(df) # Exibe as primeiras linhas do data frame "df", mostrando uma prévia dos dados str(df) # Mostra a estrutura do data frame "df", exibindo informações sobre as colunas e seus tipos ############################################################################# ###### CAMADAS DE UM GRÁFICO ############################################################################# #### CAMADA BASE - banco de dados - painel em branco ggplot(data = df) #especificando o argumento data (banco de dados) #ou ggplot(df) #sem especificar o argumento #ou df %>% ggplot() #utilizando pipe #### - Mapear as variáveis df %>% ggplot(mapping = aes(x = notificados, y = confirmados)) #OU df %>% ggplot(aes(x = notificados, y = confirmados)) # Sem o nome do argumento mapping #OU df %>% ggplot(aes(notificados, confirmados)) # sem os nomes dos argumentos x e y #valores nas escalas dos eixos X e Y e título nos eixos com os valores das variáveis #### Especificar as formas geométricas # Gráfico de dispersão # duas variáveis quantitativas df %>% ggplot(aes(notificados, confirmados)) + geom_point() #Repare que para as camadas do ggplot, será utilizado o sinal de "+" e não o pipe "%>%" #colocando o aes() na geometria df %>% ggplot() + geom_point(aes(notificados, confirmados)) #utilizando a função plot do pacote básico plot(df$notificados, df$confirmados) # Conforme se aumenta a complexidade, a função ggplot fica mais simples (comparado ao plot) # Diferenciação por sexo df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) #### - Propriedades estéticas # Pode ser definida como um valor (cor azul) ou usada para mapear uma variável (sexo) # Propriedade estética 'color' definida como 'blue', fora do aes() e dentro da geometria df %>% ggplot() + geom_point(aes(notificados, confirmados), color = 'blue') df %>% ggplot(aes(notificados, confirmados)) + geom_point(color = 'blue') # Repare, enquanto mapping pode ser definido tanto em ggplot() e geom_point(), color precisa estar em geom () df %>% ggplot(color = 'blue') + # a cor deve ser inserida dentro de aes() geom_point(aes(notificados, confirmados)) df %>% ggplot() + geom_point(aes(notificados, confirmados, color = 'blue')) #blue está sendo considerado como variável, o que não faz sentido # Propriedade estética usada para mapear uma variável (sexo), dentro do aes() df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) df %>% ggplot(aes(notificados, confirmados)) + geom_point(aes(color = sexo)) df %>% ggplot(aes(color = sexo)) + geom_point(aes(notificados, confirmados)) #### Histograma # uma varíavel quantitativa contínua df %>% ggplot() + geom_histogram(aes(notificados)) df %>% ggplot(aes(notificados)) + geom_histogram() # aes() tanto em ggplot() como em geom_histogram() # por padrão, são utilizos 30 intervalos df %>% ggplot(aes(notificados)) + geom_histogram(bins = 15) #alterando para 15 intervalos df %>% ggplot(aes(notificados)) + geom_histogram(bins = 5) #alterando para 5 intervalos df %>% ggplot(aes(notificados)) + geom_histogram(binwidth = 5) #alterando a amplitude dos intervalos para 5 df %>% ggplot(aes(notificados)) + geom_histogram(binwidth = 20) #alterando a amplitude dos intervalos para 20 # cores do contorno e do preenchimento df %>% ggplot(aes(notificados)) + geom_histogram(color = 'blue') #contorno azul df %>% ggplot(aes(notificados)) + geom_histogram(fill = 'blue') #preenchimento azul df %>% ggplot(aes(notificados)) + geom_histogram(fill = 'gray', color = 'red') #preenchimento cinza e contorno vermelho df %>% ggplot(aes(notificados)) + geom_histogram(aes(fill = local)) #preenchimento conforme a variável local df %>% ggplot() + geom_histogram(aes(notificados, fill = local)) #preenchimento conforme a variável local #### Barras # variável qualitativa df %>% ggplot() + geom_bar(aes(sexo)) df %>% ggplot() + geom_bar(aes(sexo), fill = 'lightpink') df %>% ggplot() + geom_bar(aes(sexo), fill = 'lightpink', color = 'red') df %>% ggplot() + geom_bar(aes(sexo), width = .5) #ajustar a largura das barras df %>% ggplot() + geom_bar(aes(sexo), width = .2) #ajustar a largura das barras df %>% ggplot() + geom_bar(aes(sexo), width = .9) #ajustar a largura das barras # variável quantitativa, em função de uma variável qualitativas df %>% ggplot() + geom_bar(aes(sexo, notificados), stat = 'identity') # substituiu contagem por notificados (variável quantitativa) por meio do argumento stat = 'identidy' # variável quantitativa, em função de duas variáveis qualitativas df %>% ggplot() + geom_bar(aes(sexo, notificados, fill = local), stat = 'identity') df %>% ggplot() + geom_bar(aes(sexo, notificados, fill = local), stat = 'identity', position = "dodge") #position "dodge" deixa as barras lado a lado #### Linhas # Duas variáveis quantitativas df %>% ggplot() + geom_line(aes(dia, notificados)) # adcionando uma camada df %>% ggplot() + geom_line(aes(dia, notificados)) + geom_point() # erro df %>% ggplot(aes(dia, notificados)) + #necessario colocar em ggplot geom_line() + geom_point() df %>% ggplot() + geom_line(aes(dia, notificados)) + # ou colocar em cada geometria geom_point(aes(dia, notificados)) df %>% ggplot() + geom_line(aes(dia, notificados)) + geom_point(aes(dia, notificados), color = 'blue') #acrescentando cor azul df %>% ggplot() + geom_line(aes(dia, notificados), color = 'red') + #acrescentando cor vermelho geom_point(aes(dia, notificados), color = 'blue') #### box plot #variável quantitativa distribuída em cada uma das categorias de uma variável qualitativa df %>% ggplot() + geom_boxplot(aes(sexo, notificados)) df %>% ggplot() + geom_boxplot(aes(notificados, sexo)) #inversão das variáveis quantile(df$notificados) #quantis df %>% ggplot() + geom_boxplot(aes(sexo, notificados), notch = T) # notch = T melhora a visualização df %>% ggplot() + geom_boxplot(aes(sexo, confirmados), notch = T) #confirmados #### Pirâmide #criando uma variável faixa etária df <- df %>% mutate(FET = case_when(idade < 10 ~ "0-9", idade >= 10 & idade < 20 ~ "10-19", idade >= 20 & idade < 30 ~ "20-29", idade >= 30 & idade < 40 ~ "30-39", idade >= 40 & idade < 50 ~ "40-49", idade >= 50 & idade < 60 ~ "50-59", idade >= 60 ~ "60 e mais")) %>% mutate(notificados_piramid = ifelse(sexo == "M", notificados * -1, notificados)) # a função case_when, substitui a função ifelse() df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + #coord_flip() + # Inverte o eixo geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + coord_flip() + # Inverte o eixo geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") #### Elementos modificáveis - independente dos dados df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_bw() + # FUNDO BRANCO, COM GRADES E BORDAS coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_linedraw() + # FUNDO BRANCO, COM GRADES EM DESTAQUE E BORDAS coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_minimal() + # FUNDO BRANCO, COM GRADES, SEM BORDAS coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_test() + # FUNDO BRANCO, SEM GRADES E COM BORDAS coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_classic() + # FUNDO BRANCO, SEM GRADES E BORDAS EM L coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_dark() + # FUNDO PRETO, COM GRADES coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_get() + # FUNDO CINZA, COM GRADES E SEM BORDAS coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot(aes(FET, notificados_piramid , fill = sexo, width = 1)) + theme_void() + # SEM FUNDO E SEM EIXOS coord_flip() + geom_bar(data = subset(df, sexo == "F"), stat = "identity") + geom_bar(data = subset(df, sexo == "M"), stat = "identity") df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) # dispersão notificados e confirmados, segundo faixa etária df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() # tema clássico df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab('Casos Notificados') # título do eixo X df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') # título do eixo y df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab(bquote('Casos Notificados' ^ 2)) + # título do eixo X - superescrito ylab(bquote('Casos Confirmados' [2])) # título do eixo y - subescrito df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab(bquote('Casos Notificados' ^ 2)) + # título do eixo X - superescrito ylab(bquote('Casos Confirmados' [2])) + # título do eixo y - subescrito theme(axis.title = element_text(size = 20)) # tamanho dos títulos dos eixos df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab(bquote('Casos Notificados' ^ 2)) + # título do eixo X - superescrito ylab(bquote('Casos Confirmados' [2])) + # título do eixo y - subescrito theme(axis.title.x = element_text(size = 5)) + # tamanho dos títulos dos eixos X theme(axis.title.y = element_text(size = 25)) # tamanho dos títulos dos eixos y df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(axis.title = element_text(color = 'red')) #cor dos títulos dos eixos df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(axis.text = element_text(size = 15, angle = 45)) # angulo dos valores dos eixos df %>% ggplot() + geom_point(aes(notificados, confirmados, color = FET)) + # dispersão notificados e confirmados, segundo faixa etária theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(axis.text = element_text(color = 'red')) # cor dos valores dos eixos df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) + # dispersão notificados e confirmados, segundo sexo theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(axis.text = element_text(color = 'red')) + # cor dos valores dos eixos scale_color_discrete(name = '', breaks = c('F', 'M'), labels = c("Feminino", "Masculino")) # alterando a legenda df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) + # dispersão notificados e confirmados, segundo sexo theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(legend.title = element_text(size = 25), # tamanho do título da legenda legend.text = element_text(color = 'red')) # cor do texto os elementos da legenda df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) + # dispersão notificados e confirmados, segundo sexo theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(legend.title = element_text(size = 25), # tamanho do título da legenda legend.text = element_text(color = 'red'), # cor do texto os elementos da legenda legend.position = 'top') # posição da legenda df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) + # dispersão notificados e confirmados, segundo sexo theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(legend.title = element_text(size = 25), # tamanho do título da legenda legend.text = element_text(color = 'red'), # cor do texto os elementos da legenda legend.position = 'left') # posição da legenda df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) + # dispersão notificados e confirmados, segundo sexo theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(legend.title = element_text(size = 25), # tamanho do título da legenda legend.text = element_text(color = 'red'), # cor do texto os elementos da legenda legend.position = 'bottom') # posição da legenda df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo)) + # dispersão notificados e confirmados, segundo sexo theme_classic() + # tema clássico xlab('Casos Notificados') + # título do eixo X ylab('Casos Confirmados') + # título do eixo y theme(legend.title = element_text(size = 25), # tamanho do título da legenda legend.text = element_text(color = 'red'), # cor do texto os elementos da legenda legend.position = 'none') # posição da legenda df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo), shape = 3) # dispersão notificados e confirmados, segundo sexo, alterando o shape dos pontos df %>% ggplot() + geom_point(aes(notificados, confirmados, color = sexo, shape = sexo)) # dispersão notificados e confirmados, segundo sexo, alterando o shape dos pontos segundo a variável sexo df %>% ggplot() + geom_boxplot(aes(sexo, notificados)) + # boxplot segundo sexo theme_classic() + # tema clássico ylab('Casos Notificados') + # título do eixo X xlab('Sexo') + # título do eixo y scale_x_discrete(breaks = c('F', 'M'), labels = c('Feminino', 'Masculino')) # alterando os labels dos grupos df %>% ggplot() + geom_boxplot(aes(sexo, notificados)) + # boxplot segundo sexo theme_classic() + # tema clássico ylab('Casos Notificados') + # título do eixo X xlab('Sexo') + # título do eixo y scale_x_discrete(breaks = c('F', 'M'), labels = c('Feminino', 'Masculino')) + # alterando os labels dos grupos scale_y_continuous(breaks = seq(0, 600, by = 50)) #alterando a escala do eixo y df %>% ggplot() + geom_boxplot(aes(sexo, notificados)) + # boxplot segundo sexo theme_classic() + # tema clássico ylab('Casos Notificados') + # título do eixo X xlab('Sexo') + # título do eixo y scale_x_discrete(breaks = c('F', 'M'), labels = c('Feminino', 'Masculino')) + # alterando os labels dos grupos scale_y_continuous(breaks = seq(0, 600, by = 50)) + #alterando a escala do eixo y ggtitle("Bloxplots do casos notificados, segundo sexo") #adicionando título # Gerando um gráfico de barras com os dados do dataframe df, usando sexo no eixo x, notificados no eixo y, e colorindo as barras com base na variável local. Defindo o tamanho dos ícones na legenda como 0.1 cm. df %>% ggplot() + geom_bar(aes(sexo, notificados, fill = local), stat = 'identity') + theme(legend.key.size = unit(0.1, "cm")) #tamanho do ícone da legenda7 # Defindo o tamanho dos ícones na legenda como 2 cm. df %>% ggplot() + geom_bar(aes(sexo, notificados, fill = local), stat = 'identity') + theme(legend.key.size = unit(2, "cm")) #tamanho do ícone da legenda # multiplos gráficos # Diferenciação por sexo, segundo local de ocorrência #Gerando um gráfico de dispersão utilizando os dados do dataframe `df`, mapeando "notificados" no eixo x e "confirmados" no eixo y. Aplicando a disposição em facetas com base nas variáveis "local" e "sexo". df %>% ggplot() + geom_point(aes(notificados, confirmados)) + facet_grid(local ~ sexo) #Facetando por 'local' e 'sexo' df %>% ggplot() + geom_point(aes(notificados, confirmados)) + facet_grid(. ~ sexo) #Facetando apenas por 'sexo' df %>% ggplot() + geom_point(aes(notificados, confirmados)) + facet_grid(sexo ~ .) #Facetando apenas por 'sexo' na horizontal df %>% ggplot() + geom_point(aes(notificados, confirmados)) + facet_wrap(~ FET, ncol = 2) # Facetando com 2 colunas baseadas na variável 'FET' df %>% ggplot() + geom_point(aes(notificados, confirmados)) + facet_wrap(~ FET, ncol = 1) #Facetando com 1 coluna baseada na variável 'FET' df %>% ggplot() + geom_point(aes(notificados, confirmados)) + facet_grid(sexo ~ .) + # Facetando por 'sexo' nas colunas theme(strip.text.y = element_text(size = 8, colour = 'orange', angle = 45)) # Modificando a aparência dos rótulos no painel. Configurando o tamanho do texto para 8, a cor para laranja e ajustando o ângulo para 45 graus nos rótulos do eixo y. # CORES NO R: #http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf #https://colorbrewer2.org/#type=sequential&scheme=BuGn&n=3 # FORMATOS DE PONTOS E LINHAS NO R # Cria um gráfico de pontos com diferentes formatos baseados nos valores de x ggplot(data.frame(x = factor(1:25)), aes(x = x, y = x, shape = x)) + geom_point(size = 5) + scale_shape_manual(values = 1:25) # Cria um gráfico de linhas usando geom_line com diferentes tipos de linha baseados nos valores de x ggplot(data.frame(x = rep(0:6, 10), y = rep(0:6, e = 10)), aes(x, y, linetype = factor(x))) + geom_line(size = 2) #### EXPORTANDO OS GRÁFICOS # Salvar o gráfico usando ggsave() # Cria um gráfico de dispersão com diferentes tipos de linha baseados nos valores de x ggplot(data.frame(x = rep(0:6, 10), y = rep(0:6, each = 10)), aes(x, y, linetype = factor(x))) + geom_line(size = 2) # Salva o gráfico como um arquivo de imagem PNG com largura, altura e resolução específicas ggsave("tipos_linhas.png", width = 4.85, height = 4.01, dpi = 300) ############# #salvar o gráfico usando tiff() (ou: png(),jpeg() ou pdf()) # Cria um gráfico de pontos com diferentes formatos baseados nos valores de x pontos <- ggplot(data.frame(x = factor(1:25)), aes(x = x, y = x, shape = x)) + geom_point(size = 5) + scale_shape_manual(values = 1:25) # Cria um gráfico de linhas usando geom_line com diferentes tipos de linha baseados nos valores de x linhas <- ggplot(data.frame(x = rep(0:6, 10), y = rep(0:6, e = 10)), aes(x, y, linetype = factor(x))) + geom_line(size = 2) # Cria um grid com os gráficos de pontos e linhas lado a lado plot_grid(pontos, linhas) # Cria um grid com os gráficos de pontos e linhas lado a lado, alterando os rótulos manualmente plot_grid(pontos, linhas, labels = c('pontos', 'linhas')) ## salvando # Salva o grid de gráficos como um arquivo tiff com dimensões e resolução específicas tiff("pontos_linhas.tiff", width = 4000, height = 2000, res = 300) # Cria um grid com os gráficos de pontos e linhas lado a lado, usando rótulos automáticos plot_grid(pontos, linhas, labels = 'AUTO') # Finaliza o arquivo tiff dev.off()