Aula 3 - Customizações

Author

Marina Scalon

Script utilizado na aula 3 para demostrar as funções do pacote ggplot2do tidyverse para customização de gráficos.

  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 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. Confiram a versão e atualizem para versão 2.0.0 usando a função tidyverse_update()!

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)
Warning: package 'tidyverse' was built under R version 4.0.5
-- Attaching packages --------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.4.2     v purrr   1.0.1
v tibble  3.2.1     v dplyr   1.1.2
v tidyr   1.3.0     v stringr 1.5.0
v readr   2.1.4     v forcats 1.0.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
# 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/Aula 3")
dados <- read.csv("Dados.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)
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

 ggplot(dados, aes(x=Phenology, y=SLA ))+
  geom_boxplot(aes(fill=Phenology, alpha = 0.7))+
  facet_wrap(~Vegetation)
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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()
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

ggplot(dados, aes(x=Phenology, y = SLA, fill= Phenology)) + 
  geom_boxplot()+
  facet_wrap(~Vegetation)+
  scale_fill_grey(start =0.8, end=0.4)
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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)
Warning: package 'RColorBrewer' was built under R version 4.0.5
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")
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
  scale_fill_brewer(palette = "Spectral")+
  facet_wrap(~Vegetation)
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

  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"))
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

ggplot(dados, aes(x=Phenology, y = SLA, fill =Phenology)) + 
  geom_boxplot()+
 scale_fill_manual(values = c("#33CC00", "#33CCFF", "#FF3399"))+
  facet_wrap(~Vegetation)
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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)
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

  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()
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

ggplot(dados, aes(x=SLA, fill=Phenology)) + 
  geom_density()+
  facet_wrap(~Vegetation)+
  scale_fill_simpsons()
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

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)
Warning: Removed 3 rows containing missing values (`geom_point()`).

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= SLA, size=2))+
  scale_color_gradient2(na.value=NA)
Warning: Removed 3 rows containing missing values (`geom_point()`).

ggplot(data = dados) +
  geom_point(aes(x=P, y=N, color= SLA, size=2))+
  scale_color_gradientn(colours = terrain.colors(5), na.value=NA)
Warning: Removed 3 rows containing missing values (`geom_point()`).

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, ")")))
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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")
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

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) 
Warning: Removed 6 rows containing missing values (`geom_point()`).

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))
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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())
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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())
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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())
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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())
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

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
Warning: Removed 3 rows containing non-finite values (`stat_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
Warning: Using shapes for an ordinal variable is not advised

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
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

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 = (expression(paste(r^2, " = 0.41"))), x=0.04, y=5)
pontos.final
Warning: Using shapes for an ordinal variable is not advised
Warning in is.na(x): is.na() applied to non-(list or vector) of type
'expression'

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
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 3 rows containing non-finite values (`stat_summary()`).

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
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

pal_npg("nrc")(3) #para ver o número exato das 3 primeiras cores da paleta
[1] "#E64B35FF" "#4DBBD5FF" "#00A087FF"
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
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

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
Warning: Using shapes for an ordinal variable is not advised

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
Warning: Using shapes for an ordinal variable is not advised

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
Warning: Using shapes for an ordinal variable is not advised

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)

Attaching package: 'gridExtra'
The following object is masked from 'package:dplyr':

    combine
painel <- grid.arrange(boxplot.final, fig1, densidade.final, ncol=1)
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 3 rows containing non-finite values (`stat_summary()`).
Warning: Using shapes for an ordinal variable is not advised
Warning: Removed 3 rows containing non-finite values (`stat_density()`).

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)
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).
Warning: Removed 3 rows containing non-finite values (`stat_density()`).
Warning: Using shapes for an ordinal variable is not advised

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()+
  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(legend.position = c(0.85,0.85),legend.text = element_text(size=8), legend.title = element_text(size=8), legend.background = element_rect(fill="pink", linetype = "blank"), axis.text.x=element_blank(),
        axis.ticks.x = element_blank(), axis.title.x = element_blank(), plot.background = element_rect(fill="seashell", color=NA), strip.background=element_rect(fill="plum1"), panel.background = element_rect(fill="pink"), panel.grid.major = element_blank(), panel.grid.minor = element_blank())
boxplot.markdown
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).

windowsFonts()
$serif
[1] "TT Times New Roman"

$sans
[1] "TT Arial"

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

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 = "purple"),
    plot.subtitle = element_markdown(size=15,hjust=0,family="Palatino",margin=margin(0,0,0.5,0.5,"cm"), color = "purple"),
    plot.caption = element_markdown(size=10,hjust=0,family="Courier"),
  plot.background = element_rect(fill="plum1", color=NA)))
final
Warning: Removed 3 rows containing non-finite values (`stat_boxplot()`).
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database

Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database

Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database

Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database

Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database

Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database

Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database

Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database

Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database

Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database

Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database

Para salvar:

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

FIM