Aula 4 - Customizações

Aula prática

Author

Marina Scalon

Script utilizado na aula da semana 3 da disciplina Manipulação e Visualização de Dados no R para demostrar as funções de customizações do pacote ggplot2do tidyverse.

  1. Customização dos gráficos
  1. Cores
  2. Legendas
  3. Eixos
  4. Fundo
  5. Texto e símbolos
  1. Output
  1. Salvando imagens
  2. Painéis
  3. Extra: gráficos e figuras nos gráficos

Instalando os pacotes

Nessa aula vamos utilizar o conjunto de dados da aula 1 e da aula 2 para demostrar as funcoes do ggplot2 do tidyverse. O primeiro passo então é carregar o pacote.

Para essa aula também vamos usar alguns outros pacotes que deverão ser instalados, caso você não os tenha em sua biblioteca:

  1. RColorBrewer
  2. ggsci
  3. hrbrthemes
  4. gridExtra
  5. egg
library(tidyverse)
# tidyverse_update()

Carregando o conjunto de dados

Agora vamos determinar o diretório de trabalho e carregar os dados, conforme aprendemos na aula anterior. Vamos usar o conjunto de dados já manipulados, que fizemos na aula anterior e salvamos em.csv

Você deve colocar o diretório de acordo com o seu caminho no computador, e de acordo com a localização dos seus dados.

# setwd("C:/Marina/Pos-doutorado/PNPD_UFPR/Vis Man Dados/2024/Semana3")
dados <- read.csv("Dados_english.csv")
#dados <- readr::read_csv('https://raw.githubusercontent.com/scalonmc/VisMan/master/VisManDados/Aula1/Dados_manipulados.csv')
#dados <- dados %>% rename(Phenology = `Phenological group`)

Cores

Podemos customizar a paleta padrão (default) adicionando mais uma camada!

1. Transparência (alpha)

Podemos modificar a transparência da cor com o atributo alpha.

ggplot(data = dados, aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2)) +
  geom_point(alpha=0.5)

ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density(alpha=0.5)+
  facet_wrap(~Vegetation)

 ggplot(dados, aes(x=Phenology, y=SLA ))+
  geom_boxplot(aes(fill=Phenology, alpha = 0.7))+
  facet_wrap(~Vegetation)

2. Luminescência e cromaticidade

scale_color_hue() também modifica as tonalidades da paleta nos aspetos luminescência (l) cromaticidade (c)

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2))+
  scale_color_hue(l=20)

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2))+
  scale_color_hue(c=20)

3. Tons de cinza

Incluido no ggplot2, a paleta de tons de cinza pode ser usada com uma função própria: scale_fillou color_ gray(). Nesse caso, pode-se escolher o começo e o final especificando start e end:

ggplot(dados, aes(x=Phenology, y = SLA, fill = Phenology)) +   geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_grey()

ggplot(dados, aes(x=Phenology, y = SLA, fill= Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_grey(start =0.8, end=0.4)

4. Paletas pré prontas

Modificando cores com scale_color_brewer() e scale_fill_brewer() do pacote RColorBrewer

Dentro de uma paleta, você também pode escolher os valores que você deseja começar. Nesse caso, você deve usar a função scale_color or fill_manual()

library(RColorBrewer)
display.brewer.all()

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2)) + 
  scale_color_brewer(palette = "PuRd")

my_palette <-  brewer.pal(7, name="PuRd")[c(2,4,6)]
ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2)) + 
  scale_color_manual(values=my_palette)

ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density()+
  facet_wrap(~Vegetation)+
  scale_fill_brewer(palette="Accent")

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
  scale_fill_brewer(palette = "Spectral")+
  facet_wrap(~Vegetation)

  1. Opção manual

Modificar as cores manualmente com a camada scale_color_manual() ou scale_fill_manual() informando os nomes por extenso (em inglês, entre aspas) ou informando os códigos das cores. Olhar na Tabela de referência.

Para html color codes: https://htmlcolorcodes.com/

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2)) + 
  scale_color_manual(values = c("red", "green", "orange"))

ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density()+
  facet_wrap(~Vegetation)+
  scale_fill_manual(values = c("red", "lightblue", "darkgreen"))

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
 scale_fill_manual(values = c("#33CC00", "#33CCFF", "#FF3399"))+
  facet_wrap(~Vegetation)

Dicas

  1. Faça sua própria paleta para não ficar repetindo os códigos. Para isso, crie um vetor com os códigos:
minha.paleta <- c("#33CC00", "#33CCFF", "#FF3399")

ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density()+
  facet_wrap(~Vegetation)+
  scale_fill_manual(values = minha.paleta)

  1. Vários pacotes disponíveis com paletas interessantes! GitHub também aqui! Infinitas possibilidades!
library(ggsci)

ggplot(dados, aes(x=Phenology, y = SLA, fill= Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg()

ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density()+
  facet_wrap(~Vegetation)+
  scale_fill_simpsons()

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2)) + 
  scale_color_lancet()

  1. Para gradientes - no caso da cor estar se referindo a uma variável contínua - usar scale_fill ou color_gradient(), gradient2() ou gradientn(). Pode definir a cor máxima e mínima e a cor dos valores de NA (o default é “grey50”)
ggplot(dados, aes(x=N, y=P, color=SLA))+
  geom_point()+
  scale_color_gradient(high = "black", low="white", na.value=NA)

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= SLA, size=2))+
  scale_color_gradient2(na.value=NA)

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= SLA, size=2))+
  scale_color_gradientn(colours = terrain.colors(5), na.value=NA)

Shapes

Para mudar o formato dos símbolos a mesma lógica das cores pode ser usada. Nesse caso, a camada a ser adicionada é scale_shape_manual() e os valores inseridos de acordo com o código do formato.

Shapes e números de referência

No caso dos números 21:25, note que são símbolos preenchidos. Assim, deve-se usar o comando fill no lugar do color

ggplot(data = dados, aes(x=P, y=N, fill= Phenology, shape = Vegetation, size=2)) +
  geom_point(alpha=0.5)+
  scale_shape_manual(values=c(21,22,23))

Eixos

Nome dos eixos

Modificar o nome dos eixos adicionando a camada labs()

Usar a função expression (paste) pra símbolos diferentes (alfabeto grego, subescrito, sobescrito). Veja as possibilidades aqui

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  labs(x= expression(paste("P"[leaf], " (mg ", kg^-1, ")")), y= expression(paste("N"[leaf], " (mg ", kg^-1, ")")))

ggplot(dados, aes(x=Phenology, y = SLA, fill = Phenology)) +   geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg()+
  labs(x= "Grupos fenológicos", y= expression(paste("SLA (", cm^2, g^-1, ")")))

ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density(aes(alpha=0.5))+
  facet_wrap(~Vegetation)+
  scale_fill_simpsons()+
  labs(x= expression(paste("SLA (", cm^2, g^-1, ")")), y="Density", title="Figura 1")

Modificar limites e escala

Limites com xlim() e ylim() ou coord_cartesian()

A diferença entre essas duas funções é que com xlim() ou ylim() os valores que não estão no intervalo definido são excluídos. No coord_cartesian() isso não acontece.

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  labs(x= expression(paste("P"[leaf], " (mg ", kg^-1, ")")), y= expression(paste("N"[leaf], " (mg ", kg^-1, ")")))+
  xlim(0, 0.3) + ylim(0,4) 

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  labs(x= expression(paste("P"[leaf], " (mg ", kg^-1, ")")), y= expression(paste("N"[leaf], " (mg ", kg^-1, ")")))+
  coord_cartesian(xlim = c(0, 0.3), ylim = c(0, 4))

scale_xou y_continuous() e scale_xou y_discrete()

Para contornar esse default irritante do eixo flutuante, e resolver todos nossos problemas de customização dos eixos, recomendo usar scale_x_continuous() e scale_y_continuous(). Dessa forma, com apenas uma camada, modificamos TUDO relacionado aos eixos: nome, limites, forçar a origem e intervalos (breaks).

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  scale_x_continuous(expand = c(0,0), limits = c(0, 0.3), name = expression(paste("P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_continuous(expand = c(0,0), limits = c(0,6), name =expression(paste("N"[leaf], " (mg ", kg^-1, ")")), breaks = c(0.5,1.5,2,3,4.5,5.5)) 

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  scale_x_continuous(expand = c(0,0), limits = c(0, 0.3), name = expression(paste("P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_continuous(expand = c(0,0), limits = c(0,6), name =expression(paste("N"[leaf], " (mg ", kg^-1, ")")), breaks = seq(0,6, by=0.5))

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  scale_x_continuous(expand = c(0,0), limits = c(0, 0.3), name = expression(paste("P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_continuous(expand = c(0,0), limits = c(0,6), name =expression(paste("N"[leaf], " (mg ", kg^-1, ")")), n.breaks = 10) 

Transformações diretas com scale_x ou y_ log10()

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  scale_x_log10(name = expression(paste("log P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_log10(name =expression(paste("log N"[leaf], " (mg ", kg^-1, ")"))) 

Modificando com theme()

A camada theme() é usada para mudar aspectos do texto (fonte, tipo, cor, tamanho e ângulo)

windowsFonts() para ver os nomes e as fontes disponíveis pra você - caso necessário, carregar extrafont::font_import()

Atenção para a justificação com vjust ou hjust quando modificar o ângulo

Também é usada para remover eixo e marcas!

# windowsFonts()

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg()+
  labs(x= "Grupos fenológicos", y= expression(paste("SLA (", cm^2, g^-1, ")"))) + 
  theme (axis.text.x = element_text(family = "serif", face = "italic", color = "red", size = 12, angle = 45, hjust=1))

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg()+
  labs(y= expression(paste("SLA (", cm^2, g^-1, ")"))) + 
  theme(axis.text.x = element_blank(),
                axis.ticks.x = element_blank(), axis.title.x = element_blank())

Fundo

O theme() Também pode ser usado para modificar o fundo, utilizando templates prontos, como theme_classic() ou theme_bw(), ou personalizando todos os aspectos (linhas de grade, cor do background, etc.)

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  scale_x_log10(name = expression(paste("log P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_log10(name =expression(paste("log N"[leaf], " (mg ", kg^-1, ")"))) +
  theme_classic()

Atenção para conflitos entre as camadas theme() e os templates como theme_classic() -> o template deve vir antes.

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg()+
  labs(y= expression(paste("SLA (", cm^2, g^-1, ")"))) + 
  theme_bw()+
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(), axis.title.x = element_blank())

Legendas

Guides

Para tirar legendas específicas usando guides():

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  scale_x_log10(name = expression(paste("log P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_log10(name =expression(paste("log N"[leaf], " (mg ", kg^-1, ")"))) +
  theme_classic()+
  guides(alpha= "none", size= "none")

Theme

Para tirar todas as legendas usando theme(legend.position = “none”):

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_lancet()+
  scale_x_log10(name = expression(paste("log P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_log10(name =expression(paste("log N"[leaf], " (mg ", kg^-1, ")"))) +
  theme_classic()+
  theme(legend.position = "none")

Da mesma forma que nos eixos, dentro de theme() podemos modificar todos os aspectos do texto e título da legenda (cor, tamanho, fonte).

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg()+
  labs(y= expression(paste("SLA (", cm^2, g^-1, ")"))) + 
  theme_bw()+
  theme(legend.title = element_blank(), legend.text = element_text(size=10, color="red"), axis.text.x=element_blank(),                        axis.ticks.x = element_blank(), axis.title.x = element_blank())

Importante!

Para modificar os nomes (labels) diretamente no gráfico deve-se fazer na camada de scale(): Mas atenção para não fazer confusão com seus fatores!!! Melhor mudar direto no dataset para garantir que está certo!

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg(name= "Grupos fenológicos",labels = c("Decíduas", "Sempre-verdes","Brevidecíduas"))+
  labs(y= expression(paste("SLA (", cm^2, g^-1, ")"))) + 
  theme_bw()+
  theme(legend.text = element_text(size=10), axis.text.x=element_blank(),
        axis.ticks.x = element_blank(), axis.title.x = element_blank())

Posição e fundo

Para mudar a posição e o fundo da legenda - tudo dentro de theme()

Mudei a ordem também pra ficar minha versão final de cada plot. Para isso reordenei os fatores direto no dataset final.

dados$Vegetation <-ordered(dados$Vegetation, levels = c("Forest", "Savanna", "Grassland")) 
dados$Phenology <- ordered(dados$Phenology, levels = c("Evergreen", "Semideciduous", "Deciduous"))

boxplot<- ggplot(dados, aes(x=Phenology, y = SLA, fill = Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_npg(name= "Grupos fenológicos",labels = c("Sempre-verdes","Brevidecíduas","Decíduas"))+
  labs(y= expression(paste("SLA (", cm^2, g^-1, ")"))) + 
  theme_bw()+
  theme(legend.position = c(0.85,0.85),legend.text = element_text(size=8), legend.title = element_text(size=8), axis.text.x=element_blank(),
        axis.ticks.x = element_blank(), axis.title.x = element_blank())
boxplot

pontos <- ggplot(dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_npg(labels = c("Sempre-verdes","Brevidecíduas","Decíduas"))+
  scale_x_log10(name = expression(paste("log P"[leaf], " (mg ", kg^-1, ")")))+
  scale_y_log10(name =expression(paste("log N"[leaf], " (mg ", kg^-1, ")"))) +
  theme_classic()+
  guides(alpha="none", size="none", shape="none", colour = guide_legend(override.aes = list(size=4)))+ #para mudar o tamanho do símbolo dentro da legenda
  theme(legend.position = c(0.85,0.15), legend.title = element_blank(), 
        legend.background = element_rect(color="black", linetype="solid"))
pontos

densidade <- ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density(aes(alpha=0.5))+
  scale_fill_npg(labels = c("Sempre-verdes","Brevidecíduas","Decíduas"))+
  labs(x= expression(paste("SLA (", cm^2, g^-1, ")")), y="Density")+
  guides(alpha="none")+
  theme_minimal()+ 
  theme(legend.title= element_blank(), legend.position = c(0.85,0.85))
densidade

Inserir anotações

Utilizando annotate

summary(lm(N~P, data=dados)) #R2 = 0.41

Call:
lm(formula = N ~ P, data = dados)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.3127 -0.3589 -0.1391  0.2210  3.3161 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.3044     0.1595   1.909   0.0585 .  
P            17.4744     1.8497   9.447 2.29e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.6682 on 127 degrees of freedom
Multiple R-squared:  0.4127,    Adjusted R-squared:  0.4081 
F-statistic: 89.25 on 1 and 127 DF,  p-value: 2.285e-16
pontos.final <- pontos + annotate("text", label = "r² = 0.41", x=0.04, y=5)
pontos.final

Utilizando stat_summary()

ano.box <- aov(SLA~Phenology*Vegetation, dados)
summary(ano.box)
                      Df Sum Sq Mean Sq F value   Pr(>F)    
Phenology              2  16625    8313  19.613 4.51e-08 ***
Vegetation             2  11705    5853  13.809 4.13e-06 ***
Phenology:Vegetation   4    749     187   0.442    0.778    
Residuals            117  49587     424                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
3 observations deleted due to missingness
TukeyHSD(ano.box, "Phenology")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = SLA ~ Phenology * Vegetation, data = dados)

$Phenology
                             diff       lwr      upr     p adj
Semideciduous-Evergreen 26.796086  16.06035 37.53183 0.0000001
Deciduous-Evergreen     21.732511  10.99677 32.46825 0.0000137
Deciduous-Semideciduous -5.063575 -15.60351  5.47636 0.4912441
boxplot.final <- boxplot + stat_summary(geom = "text", label = c("a", "b", "b", "a", "b", "b", "a", "b", "b"), fun=max, vjust=-1)+ ylim(20,160)
boxplot.final

Utilizando geom_label()

densidade <- ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density(aes(alpha=0.5))+
  scale_fill_npg(labels = c("Sempre-verdes","Brevidecíduas","Decíduas"))+
  labs(x= expression(paste("SLA (", cm^2, g^-1, ")")), y="Density")+
  guides(alpha="none")+
  theme_minimal()+ 
  theme(legend.title= element_blank(), legend.position = "none")
densidade

#pal_npg("nrc")(3) #para ver o número exato das 3 primeiras cores da paleta

densidade.final <- densidade +  
  geom_label(aes(x=40, y=0.015, label="Evergreen"), fill="#E64B35FF") +
  geom_label(aes(x=130, y=0.01, label="Semideciduous"), fill="#4DBBD5FF") +
  geom_label(aes(x=80, y=0.016, label="Deciduous"), fill="#00A087FF")

densidade.final

Inserir um elemento gráfico externo

Você pode inserir um elemento gráfico externo, como tabelas ou gráficos, utilizando a função annotation_custom()

Nesse exemplo, vamos inserir um boxplot mostrando as diferenças entre os grupos funcionais dentro do gráfico de pontos.

pontos1 <- ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= Phenology, shape = Vegetation, size=2, alpha=0.5)) + 
  scale_color_npg(labels = c("Evergreen","Semideciduous", "Deciduous"))+
  labs(x = expression(paste("P"[leaf], " (mg ", kg^-1, ")")), y= expression(paste("N"[leaf], " (mg ", kg^-1, ")"))) +
  theme_classic()+
  guides(alpha="none", size="none", shape="none", colour = guide_legend(override.aes = list(size=4)))+ #para mudar o tamanho do símbolo dentro da legenda
  theme(legend.position = "top", legend.title = element_blank(), 
        legend.background = element_rect(color="black", linetype="solid"))
pontos1

boxplot.grob<- ggplot(dados, aes(x=Phenology, y = N, fill = Phenology)) +geom_boxplot()+
  scale_fill_npg()+
  labs(y= expression(paste("N"[leaf], " (mg ", kg^-1, ")"))) + 
  theme_classic()+ guides(fill="none")+
  theme(axis.text.x=element_blank(),
        axis.ticks.x = element_blank(), axis.title.x = element_blank())
boxplot.grob

plot<- pontos1 + annotation_custom(ggplotGrob(boxplot.grob), xmin= 0.16, xmax = 0.23, ymin=0.5, ymax=2)
plot

Inserir figuras

Vários pacotes servem para isso, mas um dos jeitos mais fáceis é usando annotation.raster(). Vamos usar o pacote png para ler a figura.

Para mais opções veja os pacotes ggimage e cowplot

library(png)

cerrado <- readPNG("CERRADO.png")
fig1 <- pontos1 + annotation_raster(cerrado, xmin=0.16, xmax = 0.23, ymin=0.5, ymax=2)
fig1

Salvar

Usando ggsave() para figuras únicas

Em pdf: ggsave(“Figura1.pdf”, boxplot.final)

Em jpg deve ser especificado a resolução - o dpi: ggsave(“Figura1.jpg”, boxplot.final, dpi=100)

Especificando o tamanho em pdf: ggsave(“Figura2.pdf”, boxplot.final, width = 10, height= 10)

Juntar figuras em um painel com o pacote gridExtra:

library(gridExtra)
painel <- grid.arrange(boxplot.final, fig1, densidade.final, ncol=1)

Para salvar em jpg: ggsave(“Painel.jpg”, painel, dpi=300, height= 15, width=7) Para salvar em pdf: ggsave(“Painel.pdf”, painel, height= 15, width=7)

painel2 <- grid.arrange(fig1, arrangeGrob(boxplot, densidade), ncol = 2)

Figuras com design profissional

Vários pacotes estão disponíveis para fazer combinações de figuras montando painéis com ênfase no design. Aqui vou demostrar algumas funcionalidades do pacote patchwork() para combinar gráficos e ggtext(), que permite inserir elementos de markdown no gráfico. Veja as fontes disponíveis com o comando windowsFonts()

library(patchwork)
library(ggtext)

boxplot.markdown <- ggplot(dados, aes(x=Phenology, y = SLA, fill = Phenology)) + 
  geom_boxplot(alpha =0.8)+
  facet_wrap(~Vegetation)+
  scale_fill_manual(values=c("#007E6E", "#FF937E", "#B87C4C"),
    name= "Grupos fenológicos",labels = c("Sempre-verdes","Brevidecíduas","Decíduas"))+
  labs(y= expression(paste("SLA (", cm^2, g^-1, ")"))) + 
  theme(legend.position = c(0.85,0.85),legend.text = element_text(size=8), legend.title = element_text(size=8), legend.background = element_rect(fill="#F1F3E0", linetype = "blank"), axis.text.x=element_blank(),
        axis.ticks.x = element_blank(), axis.title.x = element_blank(), plot.background = element_rect(fill="#D2DCB6", color=NA), strip.background=element_rect(fill="#D2DCB6"), panel.background = element_rect(fill="#F1F3E0"), panel.grid.major = element_blank(), panel.grid.minor = element_blank())
boxplot.markdown

$serif
[1] "TT Times New Roman"

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"
#library(extrafont)
#font_import()
#showtext_auto()

final <- boxplot.markdown + plot_annotation(
  title = 'Diferences between phenological groups',
  subtitle = 'Specific leaf area for **Cerrado** species',
  caption = '*SLA calculated as the ratio between fresh leaf area and dry leaf mass ',
  theme = theme(plot.title = element_markdown(size=20,family="Arial",face="italic",margin=margin(0,0,0,0.5,"cm"), colour = "#043915"),
    plot.subtitle = element_markdown(size=15,hjust=0,family="Palatino",margin=margin(0,0,0.5,0.5,"cm"), color = "#043915"),
    plot.caption = element_markdown(size=10,hjust=0,family="Courier"),
  plot.background = element_rect(fill="#D2DCB6", color=NA)))
final

Para salvar:

ggsave(“Figura_rosa.pdf”, final, width = 10, height = 8, unit = “cm”)

FIM