curso
Facetas para ggplot2 em R
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)")

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

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)

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)

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)

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

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)

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

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)

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)

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)

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.
Cursos R
curso
Intermediário R
curso