PERSONALIZANDO GRÁFICOS COM

O PACOTE 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]\]

1 INTRODUÇÃO

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:

  • Gráficos naturalmente mais bonitos;
  • Fácil personalização (mais simples deixar o gráfico do jeito que você quer);
  • A estrutura padronizada das funções deixa o aprendizado mais intuitivo;
  • A diferença no código entre tipos diferentes de gráficos é muito pequena.

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:

  • x: A variável que ficará no eixo x do gráfico
  • y: A variável que ficará no eixo y do gráfico
  • fill: A variável que preencherá estruturas gráficas. Muito útil em dados qualitativos, para fazer gráficos de barras empilhadas.
  • color: A variável que será destacada por cores.
  • label: A variável que será “escrita” no gráfico.

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 +.

1.1 OBJETIVOS

Os objetivos do presente minicurso são os seguintes:

  • Aprofundar os conhecimentos no pacote ggplot2 e no R.
  • Personalizar gráficos com o pacote ggplot2.
  • Aprender novas abordagens gráficas que não são usuais.

TODOS os códigos gráficos utilizados nesse minicurso estão explicados no GLOSSÁRIO, incluso no site RPUBS

2 APLICAÇÕES PRÁTICAS

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.

2.1 NUTRIÇÃO E PANDEMIA

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.

2.2 CARGA GLOBAL DE DOENÇAS (GBD)

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

3 SPOILERS

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

4 PACOTES

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

5 GRÁFICOS PARA VARIÁVEIS QUALITATIVAS

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 .

5.1 GRÁFICOS DE BARRAS EMPILHADAS

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))

5.1.1 EXERCÍCIOS

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)

5.1.2 EXTRAS

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.

5.1.2.1 BARRAS ALINHADAS

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))

5.1.2.2 ALTERAR AS CORES

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")

5.2 GRÁFICOS DONUT

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

5.2.1 EXERCÍCIOS

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.