ggplot2 (PARTE
I)
\[\\[0.05in]\]
2ª ESCOLA DE VERÃO
PROF. GUILHERME AUGUSTO VELOSO
UFF - 12 e 14 DE MARÇO DE 2023
\[\\[0.1in]\]
A construção de gráficos no R foi revolucionada
com a criação do pacote ggplot2, fruto da
tese de doutorado do Hadley Wickham, em 2005. Essa
revolução teve base na filosofia que Hadley adotou para responder a
pergunta “O que é um gráfico estatístico?”.
Em 2005, o estatístico norte-americano Leland Wilkinson publicou o livro The Grammar of graphics (A gramática dos gráficos, em português), uma fonte de princípios fundamentais para a construção de gráficos estatísticos. No livro, ele defende que um gráfico é o mapeamento dos dados em atributos estéticos (posição, cor, forma, tamanho) de formas geométricas (pontos, linhas, barras, caixas).
A partir dessa definição, Hadley escreveu A Layered Grammar of Graphics (Uma gramática em camada dos gráficos), acrescentando que os elementos de um gráfico (dados, sistema de coordenadas, rótulos, anotações, entre outros) são as suas camadas e que a construção de um gráfico se dá pela sobreposição dessas camadas.
Essa é a essência do ggplot2:
construir um gráfico camada por camada.
Além de uma filosofia bem fundamentada, o
ggplot2 ainda traz outras vantagens em relação aos
gráficos do R base:
Desde a sua criação em 2005, o pacote
ggplot2 vem recebendo diversas contribuições do
próprio pacote e de outros pacotes para que a
experiência gráfica no R seja cada vez mais completa.
Para relembrar, a função base a ser utilizada se
chama ggplot (sem o 2). O comando básico a
partir do qual vamos gerar praticamente todos os gráficos é
ggplot(data = "insira os seus dados", mapping = aes("argumentos gráficos"))
O argumento mapping = aes(.) tem a função de descrever
como as variáveis dos seus dados serão usadas para a representação
visual. Dentro do aes(), pode ser útil estabelecer os
seguintes:
O argumento mapping = aes(.) não aparece somente nessa
função base. Ele também aparece em outros comandos do
ggplot2. A dica é: sempre que você
precisar associar alguma variável do seus dados para alguma
representação gráfica, esse argumento deve ser utilizado.
As camadas vão sendo colocadas nessa função base
simplesmente utilizando o comando +.
Os objetivos do presente minicurso são os seguintes:
ggplot2 e no R.ggplot2.TODOS os códigos gráficos utilizados nesse minicurso
estão explicados no GLOSSÁRIO, incluso no site RPUBS
Antes de construirmos muitos gráficos, é necessário passar pelas aplicações práticas que serão utilizadas neste minicurso. A primeira delas retrata os dados de nutrição durante a pandemia. A segunda aplicação apresenta a morbimortalidade brasileira a partir dos dados do Estudo Carga Global de Doenças.
Utilizaremos, os dados coletados por alunas do curso de pós-graduação em nutrição da UFF com informações sobre 2210 pessoas que responderam um questionário online no ano de 2022. O estudo teve por objetivo avaliar a alteração alimentar dos respondentes com respeito à pandemia. A base de dados original possui mais de 80 variáveis. Para este minicurso, utilizaremos apenas as seguintes variáveis:
GENERO = Gênero (F: Feminino, M:
Masculino)RACA_COR = Raça/Cor (Parda, Preta,
Branca, Indígena e Amarela)REGIAO = Região do país (Centro-Oeste,
Nordeste, Norte, Sudeste e Sul)ISOLAMENTO = Isolamento social durante
a pandemia (Sim e Não)DIFICULDADE = Dificuldade financeira
durante a pandemia (Sim e Não)DOCES = Consumo de doces durante a
pandemia (Aumentou, Diminuiu, Não alterou)OVOS_CARNES = Consumo de ovos/carnes durante a
pandemia (Aumentou, Diminuiu, Não alterou)A base de dados está armazenada no objeto
Dados1.csv.
O estudo Carga Global de Doença (Global Burden of Disease – GBD) teve início em 1990 sob a coordenação do Institute for Health Metrics and Evaluation (IHME), da Universidade de Washington. O IHME produz e aprimora um conjunto de estimativas de indicadores de saúde regionais e globais consistentes e comparáveis entre as distintas regiões do planeta.
Os dados utilizados pelo IHME são coletados e analisados por uma rede de mais de 7000 pesquisadores espalhados por mais de 156 países e territórios. Transformados em métricas, exprimem incidência, prevalência, mortalidade prematura, incapacidade, bem como anos de vida saudável perdidos em decorrência de mais de 350 doenças e lesões, mais de 80 fatores de risco, em 204 países e territórios.
O estudo GBD representa, portanto, um esforço científico sistemático de quantificação da magnitude da perda de saúde decorrente de doenças, lesões, fatores de risco e de óbitos ano a ano, segundo faixas etárias e sexo, regiões do mundo, países e, em alguns desses, estados, províncias e municípios.
Para este minicurso, serão utilizadas as seguintes variáveis do estudo GBD:
LOCAL = Brasil e as 27 unidades da
federação.REGIAO = Região do país (Brasil,
Centro-Oeste, Nordeste, Norte, Sudeste e Sul).GENERO = Gênero (F: Feminino, M:
Masculino).FAIXA_ETARIA = Faixas etárias (Todas
as idades, 0 a 9 anos, 10 a 24 anos, 25 a 49 anos, 50 a 69 anos e
70+)ANO = Anos entre 1990 e 2019.CAUSA = Causa básica de morte (21
causas de morte disponíveis)METRICA = Número absoluto de óbitos ou
taxa de mortalidade (óbitos/população * 100,000).VALOR = Estimativa da
mortalidade.Para mais detalhes sobre o estudo GBD, basta
consultar os sites GBD e GBD Compare. A
base de dados está armazenada no arquivo
Dados2.csv
Para motivá-los, as figuras a seguir apresentam alguns dos gráficos que vamos construir:
GRÁFICOS DE BARRAS EMPILHADAS\[\\[0.05in]\]
GRÁFICOS DONUT\[\\[0.05in]\]
GRÁFICOS HEATMAP
\[\\[0.05in]\]
GRÁFICOS SÉRIE TEMPORAL
\[\\[0.05in]\] GRÁFICOS DE ÁREA
\[\\[0.05in]\]
GRÁFICOS BOXPLOT
\[\\[0.05in]\]
GRÁFICOS HISTOGRAMA
EM BREVE
\[\\[0.05in]\]
GRÁFICOS DE DISPERSÃO
EM BREVE
\[\\[0.05in]\]
GRÁFICOS PIRÂMIDE
EM BREVE
\[\\[0.05in]\] GRÁFICOS COM DOIS EIXOS VERTICAIS
EM BREVE
Para a condução dessa parte do minicurso, serão utilizados os seguintes pacotes:
require(readr) # Leitura de arquivos .csv
require(dplyr) # Manipulação de bases de dados
require(ggplot2) # Abordagem Gráfica
require(webr) # Gráfico Donut
Lembre-se que as variáveis qualitativas são aquelas
cujas observações podem ser separadas em diferentes
categorias que se distinguem por alguma característica
principalmente não numérica. Por exemplo:
gênero (masculino e feminino), cor dos cabelos
(preto, loiro, ruivo, castanho, etc). Essas variáveis são muito
comuns principalmente na área da saúde e sociais. Para
explorar esse tipo de variável, utilizaremos a
base de dados Dados1.csv construindo
gráficos de barras e Donut .
O gráfico de barras empilhadas estende o gráfico de barras padrão em uma única variável qualitativa para duas. Cada barra do gráfico de barras padrão é dividida em um número de subbarras empilhadas, cada uma correspondendo a um nível da segunda variável qualitativa.
No gráfico de barras empilhadas, nos preocupamos com a decomposição relativa de cada barra primária com base nos níveis de uma segunda variável qualitativa. Cada barra é agora composta por um número de subbarras, cada uma correspondendo a um nível de uma variável qualitativa secundária. O comprimento total de cada barra empilhada é o mesmo de antes, mas agora podemos ver como os grupos secundários contribuíram para esse total.
Uma consideração importante na construção de um gráfico de barras empilhadas é decidir qual variável qualitativa responderá pelo empilhamento das barras. Qualquer alteração das variáveis vai gerar uma configuração gráfica totalmente diferente.
No nosso minicurso, para exemplificar o uso do gráfico de barras empilhadas, considere o objetivo de investigar como o gênero se relaciona com o consumo de doces durante a pandemia. Um gráfico de barras empilhadas pode ser bastante útil para descrever a relação entre essas duas variáveis. Inicialmente, calculemos as proporções do consumo de doces dentro de cada gênero:
# Leitura dos Dados de Nutrição na Pandemia
Dados1<-read_csv("Dados1.csv")
DadosA <- Dados1 %>% # vamos modificar a base Dados1
group_by(GENERO, DOCES) %>% # pegando todas as combinações possíveis de gênero e doces
summarise(N=n())%>% # a função n() é responsável por contar quantas vezes cada combinação aparece
mutate(PROP=N/sum(N)) # calcula as proporções das categorias da variável DOCES para cada gênero.
DadosA
## # A tibble: 6 × 4
## # Groups: GENERO [2]
## GENERO DOCES N PROP
## <chr> <chr> <int> <dbl>
## 1 F Aumentou 810 0.498
## 2 F Diminuiu 320 0.197
## 3 F Nao alterou 496 0.305
## 4 M Aumentou 169 0.307
## 5 M Diminuiu 121 0.220
## 6 M Nao alterou 261 0.474
Agora com esse objeto DadosA, podemos construir
o gráfico de barras empilhadas com a função
geom_col()da seguinte forma:
ggplot(DadosA,mapping = aes(x = GENERO, y=PROP, fill=DOCES)) +
geom_col(position = position_fill())+
scale_y_continuous(labels = scales::percent_format())+
theme_bw()+
xlab("GÊNERO")+
ylab("FREQUÊNCIA RELATIVA (%)")+
guides(fill=guide_legend(title="CONSUMO DE DOCES"))+
theme(legend.position="bottom",text=element_text(size=15))
Considere agora a necessidade de colocar os valores das
porcentagens dentro das respectivas barras no gráfico. Isso
pode ser feito com a inclusão da função
geom_text():
ggplot(DadosA,mapping = aes(x = GENERO, y=PROP, fill=DOCES)) +
geom_col(position = position_fill())+
geom_text(aes(label=scales::percent(PROP,accuracy = 1)),
colour = "white",
position = position_fill(vjust = 0.5),
size=5)+
scale_y_continuous(labels = scales::percent_format())+
theme_bw()+
xlab("GÊNERO")+
ylab("FREQUÊNCIA RELATIVA (%)")+
guides(fill=guide_legend(title="CONSUMO DE DOCES"))+
theme(legend.position="bottom",text=element_text(size=15))
Até então, trabalhamos com apenas duas variáveis qualitativas
mas, em muitos casos, a análise descritiva envolve
verificar relações entre mais de duas variáveis.
Graficamente, com o ggplot2 isso pode ser feito com
o auxílio da função facet_grid(). Inicialmente,
vamos verificar como se relacionam as variáveis
GENERO e REGIAO com a
variável DOCES:
DadosB <- Dados1 %>%
group_by(GENERO, REGIAO, DOCES) %>%
summarise(N=n())%>%
mutate(PROP=N/sum(N))
O gráfico é então realizado com os seguintes comandos:
ggplot(DadosB,mapping = aes(x = GENERO, y=PROP, fill=DOCES)) +
geom_col(position = position_fill())+
geom_text(aes(label=scales::percent(PROP,accuracy = 1)),
colour = "white",
position = position_fill(vjust = 0.5),
size=5)+
scale_y_continuous(labels = scales::percent_format())+
facet_grid(~REGIAO)+
theme_bw()+
xlab("GÊNERO")+
ylab("FREQUÊNCIA RELATIVA (%)")+
guides(fill=guide_legend(title="CONSUMO DE DOCES"))+
theme(legend.position="bottom",text=element_text(size=15))
Podemos colocar mais uma variável junto das
anteriores. Que tal avaliar a relação das
variáveis GENERO, REGIAO e
Isolamento com a variável
DOCES? Isso pode ser feito adaptando a função
facet_grid() do seguinte modo:
DadosC <- Dados1 %>%
group_by(GENERO, REGIAO, ISOLAMENTO, DOCES) %>%
summarise(N=n())%>%
mutate(PROP=N/sum(N))
ggplot(DadosC,mapping = aes(x = GENERO, y=PROP, fill=DOCES)) +
geom_col(position = position_fill())+
geom_text(aes(label=scales::percent(PROP,accuracy = 1)),
colour = "white",
position = position_fill(vjust = 0.5),
size=4)+
scale_y_continuous(labels = scales::percent_format())+
facet_grid(ISOLAMENTO~REGIAO)+
theme_bw()+
xlab("GÊNERO")+
ylab("FREQUÊNCIA RELATIVA (%)")+
guides(fill=guide_legend(title="CONSUMO DE DOCES"))+
theme(legend.position="bottom",text=element_text(size=15))
1- Faça um gráfico de barras empilhadas para estudar a relação da
variável dificuldade financeira com o consumo de ovos e carnes. (Crie
uma base chamada de D1 para esse exercício)
2- Faça um gráfico de barras empilhadas para estudar a relação das
variáveis dificuldade financeira e raça com o consumo de ovos e carnes.
(Crie uma base chamada de D2 para esse exercício)
3- Faça um gráfico de barras empilhadas para estudar a relação das
variáveis dificuldade financeira, raça e gênero com o consumo de ovos e
carnes. (Crie uma base chamada de D3 para esse
exercício)
Para encerrar essa abordagem de gráficos de barras empilhadas, pode ser útil ainda fazer dois pequenos ajustes: alinhar as barras e alterar as cores. As próximas linhas são dedicadas a essas duas adaptações.
Quando colocamos as porcentagens dentro das barras empilhadas,
podemos nos deparar, muitas vezes, com “fatias”
muito pequenas que dificultam a visualização das porcentagens.
Além disso, é de interesse que essas pequenas fatias sejam
visualizadas. Uma alternativa para atravessar
esse problema é alinhar as barras. Isso pode ser feito
a partir do comando geom_col(position = "dodge") de acordo
com o código abaixo:
## Consideramos novamente a base DadosA
ggplot(DadosA,mapping = aes(x = GENERO, y=PROP, fill=DOCES)) +
geom_col(position = "dodge")+
geom_text(aes(label=scales::percent(PROP,accuracy = 1)),
colour = "black",
position = position_dodge(0.9),
vjust = 0,size=4)+
scale_y_continuous(labels = scales::percent_format())+
theme_bw()+
xlab("GÊNERO")+
ylab("FREQUÊNCIA RELATIVA (%)")+
guides(fill=guide_legend(title="CONSUMO DE DOCES"))+
theme(legend.position="bottom",text=element_text(size=15))
Se as cores que o R coloca para você
por padrão não te agradaram, é possível alterá-las de
diversas maneiras. Aqui, nesse exemplo, usaremos a função
scale_fill_manual( ). É importante ressaltar que
as cores devem ser colocadas na ordem das categorias da variável
que deve ser representada.
## Consideramos a base Dados C
ggplot(DadosC,mapping = aes(x = GENERO, y=PROP, fill=DOCES)) +
geom_col(position = position_fill())+
geom_text(aes(label=scales::percent(PROP,accuracy = 1)),
colour = "white",
position = position_fill(vjust = 0.5),
size=4)+
scale_y_continuous(labels = scales::percent_format())+
facet_grid(ISOLAMENTO~REGIAO)+
scale_fill_manual(values=c("red","blue","orange"))+
guides(fill=guide_legend(title="CONSUMO DE DOCES"))+
theme_bw()+
xlab("GÊNERO")+
ylab("FREQUÊNCIA RELATIVA (%)")+
theme(legend.position="bottom")
Um gráfico de rosca (Donut, em inglês) é uma variação de um gráfico de pizza padrão. Seu nome vem da semelhança com o quitute, sendo que a maior diferença entre os gráficos de pizza e os de rosca é a presença de um furo no centro.
Pode ser usado tanto para representar uma única porcentagem quanto para representar vários números percentuais que juntos somam 100%, onde o gráfico de rosca irá mostrar cada parte do todo e você poderá chamar a atenção no centro do gráfico a parte que mais contribui para o todo ou a que menos contribui.
Uma desvantagem desse gráfico é não permitr uma boa visualização de fatias muito pequenas (residuais). Uma solução é agregar categorias ou buscar outro recurso gráfico para representar seus dados.
No R, esse gráfico é feito com o pacote
webr e a função PieDonut.
Inicialmente, vamos criar um gráfico Donut
para as variáveis REGIAO e
DOCES. O gráfico pode ser feito com os comandos abaixo:
DadosD <- Dados1 %>%
group_by(REGIAO, DOCES) %>%
summarise(N=n())
PieDonut(DadosD, aes(REGIAO,DOCES, count=N), title = " ",labelpositionThreshold = 1,start=pi/2,showPieName = F)
Note que as porcentagens externas foram todas calculadas com
base em cada categoria da variável REGIAO. Se você
quiser que as porcentagens sejam calculadas com respeito a todos
os dados, inclua o argumento ratioByGroup = F no
código anterior:
PieDonut(DadosD, aes(REGIAO,DOCES, count=N), title = " ",labelpositionThreshold = 1,start=pi/2,ratioByGroup = F, showPieName = F)
Uma última modificação interessante é
explodir uma das “fatias”. Essa manipulação pode ser
interessante para destacar alguma fatia. Isso é feito
com o acréscimo do comando
explode="número". O número colocado nesse
argumento acompanha a ordem das categorias da
variável.
PieDonut(DadosD, aes(REGIAO,DOCES, count=N), title = " ",labelpositionThreshold = 1,start=pi/2,explode = 4,showPieName = F)
A função PieDonut() é bastante
ampla e permite muitas outras adaptações interessantes.
Podem ser alterados: tamanho das letras, título, formas de
“explosão”, posição das legendas e rotação do gráfico, dentre outros.
Outras modificações mais específicas como cores e número de casas
decimais podem ser obtidas facilmente manipulando a própria
função PieDonut().
Para entender facilmente todos os argumentos da função
PieDonut(), basta fazer ?PieDonut
1- Faça um gráfico do tipo Donut para as variáveis
REGIAO e OVOS_CARNES.
2- Com o gráfico anterior, “exploda” alguma das categorias.