Pular para o conteúdo principal

Facetas para ggplot2 em R

Neste tutorial, você aprenderá a aproveitar ao máximo as funções de faceta do ggplots.
Actualizado 16 de jan. de 2025  · 8 min de leitura

Introdução

Com o facetamento, você pode criar gráficos de vários painéis e controlar como as escalas de um painel se relacionam com as escalas de outro.

Uso simples de facetas

Se você estiver familiarizado com o ggplot2, conhecerá a estrutura básica de uma chamada para a função ggplot(). Para obter uma introdução ao ggplot2, você pode conferir nosso curso ggplot2. Ao chamar ggplot, você fornece uma fonte de dados, geralmente um quadro de dados, e pede ao ggplot para mapear diferentes variáveis em nossa fonte de dados para diferentes estéticas, como a posição dos eixos x ou y ou a cor de nossos pontos ou barras. Com as facetas, você ganha uma maneira adicional de mapear as variáveis. Para demonstrar isso, você usará o conjunto de dados a seguir, que inclui vários indicadores econômicos para uma seleção de países. A maioria delas são variantes do PIB, o Produto Interno Bruto de cada país.

 print(econdata)
##   Country  GDP_nom  GDP_PPP GDP_nom_per_capita GDP_PPP_per_capita
## 1     USA 19390600 19390600              59501              59495
## 2  Canada  1652412  1769270              45077              48141
## 3   China 12014610 23159107               8643              16807
## 4   Japan  4872135  5428813              38440              42659
## 5  France  2583560  2835746              39869              43550
## 6 Germany  3684816  4170790              44550              50206
## 7  Sweden  3684816   520937              53218              51264
## 8 Ireland   333994   343682              70638              72632
##   GNI_per_capita        Region
## 1          58270 North America
## 2          42870 North America
## 3           8690          Asia
## 4          38550          Asia
## 5          37970        Europe
## 6          43490        Europe
## 7          52590        Europe
## 8          55290        Europe

As seguintes variáveis estão presentes:

País: Você sabe o que está dizendo!

GDP_nom: Produto Interno Bruto como um valor nominal em dólares americanos

GDP_PPP: Produto Interno Bruto controlado para poder de compra diferente

GDP_nom_per_capita: Produto Interno Bruto como um valor nominal em dólares americanos em uma base per capita

GDP_PPP_per_capita: Produto Interno Bruto controlado para poder de compra diferente em uma base per capita

GNI_per_capita: Renda Nacional Bruta de cada país em uma base per capita.

Região: região do mundo onde o país está localizado.

Para começar, vamos fazer um gráfico de barras simples do PIB nominal de cada país.

ggplot(econdata, aes(x=Country, y=GDP_nom))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (nominal)")
trama

Você também pode traçar outra variável, o PIB ajustado pela PPP.

ggplot(econdata, aes(x=Country, y=GDP_PPP))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (PPP)")
trama

Isso fornece a você um segundo gráfico separado, semelhante ao anterior, mas usando uma variável diferente. Digamos que você queira plotar o PIB (nominal) e o PIB (PPP) juntos. Para isso, você usará o facetamento. Primeiro, você precisará reformatar seus dados, alterando-os de um formato "amplo", com cada variável em sua própria coluna, para um formato "longo", em que você usa uma coluna para suas medidas e outra para uma variável-chave que nos informa qual medida usamos em cada linha.

econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))

Quando você tiver os dados nesse formato, poderá usar nossa variável-chave para plotar com facetas. Vamos criar um gráfico simples, mostrando tanto o PIB nominal (do nosso primeiro gráfico) quanto o PIB (PPP) (do nosso segundo gráfico). Para fazer isso, basta modificar o código para adicionar +facet_wrap() e especificar que ~measure, nossa variável-chave, deve ser usada para facetar.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure)
trama

Isso funciona, mas você notará como os nomes dos países estão esmagados. Vamos reorganizar nossos painéis.

Personalização do layout e reordenação

O comando facet_wrap() escolherá automaticamente quantas colunas você usará. Você pode especificar isso diretamente usando ncol=, da seguinte forma:

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1)
trama

Você provavelmente notou que os países, no eixo x acima, estão organizados em ordem alfabética. Se você quiser alterar isso, a maneira mais fácil de fazer isso é definir os níveis do fator Country. Vamos fazer essa reordenação, organizando os países em ordem de PIB nominal total.

econdata$Country <- factor(econdata$Country, levels= econdata$Country[order(econdata$GDP_nom)])


econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1)
trama

Você também pode fazer algumas personalizações adicionais, como mover os rótulos das facetas para o lado esquerdo com o argumento strip.position.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, strip.position = "left")
trama

Facetas de rotulagem

Você deve ter notado que as facetas têm títulos curtos e simples, retirados dos níveis do fator measure. Vamos arrumar isso e dar às nossas facetas alguns rótulos mais bonitos. Para fazer isso, você criará uma função de rotulagem simples, variable_labeller, que retornará o nome apropriado quando for solicitado um dos valores de variable_names. Em seguida, você passa essa função para o argumento labeller de facet_wrap.

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" ,
  "GDP_PPP" = "GDP (purchasing power parity)"
)


variable_labeller <- function(variable,value){
  return(variable_names[value])
}


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, labeller=variable_labeller)
trama

Brincando com escalas e espaço

Vamos criar um gráfico facetado maior, usando cada uma das medidas econômicas.

econdatalong <- gather(econdata, key="measure", value="value", c( "GDP_nom" , "GDP_PPP" ,"GDP_nom_per_capita", "GDP_PPP_per_capita" ,"GNI_per_capita"))

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" ,
  "GDP_PPP" = "GDP (purchasing power parity)",
  "GDP_nom_per_capita" = "GDP (nominal) per capita",
  "GDP_PPP_per_capita" = "GDP (purchasing power parity) per capita",
  "GNI_per_capita"  = "GNI per capita"
)


variable_labeller <- function(variable,value){
  return(variable_names[value])
}



ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, labeller= variable_labeller)+
scale_y_continuous(breaks = pretty(econdatalong$value, n = 10))
trama

Isso não é nada bom! Você não consegue ver os valores de três dos painéis. Por que isso acontece? Vamos dar uma olhada nos dados primários para ver por quê.

summary(econdata)
##     Country     GDP_nom            GDP_PPP         GDP_nom_per_capita
##  Ireland:1   Min.   :  333994   Min.   :  343682   Min.   : 8643     
##  Canada :1   1st Qu.: 2350773   1st Qu.: 1457187   1st Qu.:39512     
##  France :1   Median : 3684816   Median : 3503268   Median :44814     
##  Germany:1   Mean   : 6027118   Mean   : 7202368   Mean   :44992     
##  Sweden :1   3rd Qu.: 6657754   3rd Qu.: 8919260   3rd Qu.:54789     
##  Japan  :1   Max.   :19390600   Max.   :23159107   Max.   :70638     
##  (Other):2                                                           
##  GDP_PPP_per_capita GNI_per_capita            Region
##  Min.   :16807      Min.   : 8690   Asia         :2  
##  1st Qu.:43327      1st Qu.:38405   Europe       :4  
##  Median :49174      Median :43180   North America:2  
##  Mean   :48094      Mean   :42215                    
##  3rd Qu.:53322      3rd Qu.:53265                    
##  Max.   :72632      Max.   :58270                    
##

Se você der uma olhada em cada coluna, verá que os valores em cada coluna variam em algumas ordens de magnitude. Por padrão, a facetação usará os mesmos limites e intervalos para os eixos X e Y. Para alterar isso, você pode adicionar este snippet ao seu código de facetas: scales="free_y" para que cada faceta use sua própria escala independente.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, scales="free_y", ncol=1,  labeller= variable_labeller)
trama

Isso é muito melhor. Cada faceta agora tem seu próprio eixo y independente.

Uso de facetas para criar subdivisões

Você deve ter notado que nosso conjunto de dados também inclui a variável Region, que indica a região em que o país em questão está localizado. Você pode usar essa variável para colorir nossas barras de acordo com a região, como segue:

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_wrap(~measure, scales="free_y", ncol=1, labeller= variable_labeller)
trama

No entanto, isso é um pouco confuso. Não seria bom se você pudesse colocar cada uma das diferentes regiões em seu próprio subpainel? Bem, com o facetamento, você pode! Aqui você usará facet_grid em vez de facet_wrap, pois isso facilitará o mapeamento de nossas facetas para duas variáveis, Region e measure, em que todas essas duas variáveis estão espalhadas pelas linhas e colunas de uma grade de gráficos. Observe que você também está definindo scales="free" e space="free", permitindo que nossos diferentes painéis ocupem diferentes quantidades de espaço. Você também precisará criar uma nova função de rotulador, que produzirá nomes para linhas e rótulos.

variable_names <- list(
  "GDP_nom" = "GDP \n(nominal)" ,
  "GDP_PPP" = "GDP \n(PPP)",
  "GDP_nom_per_capita" = "GDP (nominal)\n per capita",
  "GDP_PPP_per_capita" = "GDP (PPP)\n per capita",
  "GNI_per_capita"  = "GNI \nper capita"
)



region_names <- levels(econdata$Region)


variable_labeller2 <- function(variable,value){
  if (variable=='measure') {
  return(variable_names[value])
  } else {
    return(region_names)
  }
}

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_grid(measure~Region, scales="free", space="free_x",  labeller= variable_labeller2)
trama

Agora está muito mais claro! Cada região tem sua própria coluna de painéis, e cada métrica tem sua própria linha de barras.

Com isso, você está pronto para este tutorial. Espero que você tenha gostado de aprender sobre facetas.

Se você quiser saber mais sobre facetas, faça o curso Visualizing Big Data with Trelliscope do DataCamp.

Confira nosso site Getting Started with the Tidyverse: Tutorial.

Temas

Cursos R

Certificação disponível

curso

Introdução ao R

4 hr
2.8M
Domine os conceitos básicos de análise de dados em R, incluindo vetores, listas e quadros de dados, e pratique o R com conjuntos de dados reais.
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow