Teste: Teste
O seguinte guia tem como objetivo dar o passo a passo para a criação do grafico abaixo, incluindo os detalhes dos boxplots e já integrando o teste T ou ANOVA de acordo com a necessidade.
O primeiro passo é carregar os pacotes necessários, onde:
library(dplyr); library(ggplot2);library(tidyr);library(readxl);library(ggpubr)
O proximo passo será carregar a planilha com os dados. O formato utilizado aqui será o mesmo usado nas planilhas do metaboanalyst, onde as duas primeiras colunas respectivamente correspondem a identificação das amostras e grupos enquanto as demais são referentes aos metabolitos.
exemplo_boxplot <- read_excel("exemplo_boxplot.xlsx")
Em maiores detalhes o que ocorreu foi a criação do objeto “exemplo_boxplot” que passou a armazenar o conteúdo da planilha “exemplo_boxplot.xlsx” que existe no computador. Lembrando que o objeto é de fato uma cópia do conteúdo da planilha de forma que qualquer alteração no objeto “exemplo_boxplot” não reflete de maneira alguma na planilha original, a menos que o resultado seja salvo subscrevendo o conteúdo da planilha.
Podemos ver uma previa do conteúdo das 10 primeiras linhas do dataframe contendo os dados com o código abaixo.
head(exemplo_boxplot)
## # A tibble: 6 × 18
## Samples Class Acetate Cysteine Methionine Acetone Acetoacetate Oxaloacetate
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 Control 0.463 0.503 0.325 0.388 0.327 0.235
## 2 2 Control 0.555 0.634 0.489 0.376 0.428 0.401
## 3 3 Control 0.417 0.557 0.341 0.395 0.367 0.279
## 4 4 Control 0.812 0.710 0.539 0.641 0.575 0.328
## 5 5 Control 0.395 0.677 0.413 0.573 0.585 0.356
## 6 6 Control 0.643 0.493 0.480 0.362 0.326 0.306
## # ℹ 10 more variables: Creatinine <dbl>, Malonate <dbl>, Acetylcarnitine <dbl>,
## # Carnitine <dbl>, TMAO <dbl>, Taurine <dbl>, Glycine <dbl>, Glutamate <dbl>,
## # Glutamine <dbl>, Urea <dbl>
Neste arquivo a linha seguinte faz a representação dos dados, mas não
é necessário roda-la quando for executar este script.
Não é necessário executar a linha abaxo
kable(head(exemplo_boxplot[1:10]))
| Samples | Class | Acetate | Cysteine | Methionine | Acetone | Acetoacetate | Oxaloacetate | Creatinine | Malonate |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Control | 0.4628905 | 0.5033750 | 0.3246518 | 0.3883116 | 0.3270534 | 0.2348812 | 14.30523 | 0.2924812 |
| 2 | Control | 0.5548366 | 0.6336342 | 0.4887827 | 0.3764663 | 0.4280284 | 0.4012602 | 19.13319 | 0.4415767 |
| 3 | Control | 0.4165521 | 0.5566646 | 0.3411788 | 0.3949231 | 0.3674614 | 0.2790612 | 13.46725 | 0.5438242 |
| 4 | Control | 0.8115738 | 0.7095755 | 0.5387075 | 0.6412245 | 0.5747224 | 0.3279688 | 14.96503 | 0.3851795 |
| 5 | Control | 0.3947780 | 0.6767817 | 0.4132495 | 0.5730406 | 0.5845595 | 0.3558556 | 13.88765 | 0.3773782 |
| 6 | Control | 0.6431932 | 0.4934394 | 0.4798634 | 0.3616937 | 0.3262930 | 0.3060608 | 11.57089 | 0.4599292 |
Uma vez que a planilha está carregada como um dataframe é pronta para uso, vamos iniciar a manipulação do formato dos dados para o requerido pelo pacote. A primeira limitação do dado multivariádo é que o ggplot exige que cada eixo do grafico seja correpondente a apenas uma unica variável (Cada coluna no dataframe é uma variável diferente), mas como pretendemos plotar todos os metabolitos, é necessário agrupar todos em uma unica variável. Isso pode ser feito com a função gather() do pacote tidyr.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")
## # A tibble: 800 × 4
## Samples Class Metabolite Concentration
## <dbl> <chr> <chr> <dbl>
## 1 1 Control Acetate 0.463
## 2 2 Control Acetate 0.555
## 3 3 Control Acetate 0.417
## 4 4 Control Acetate 0.812
## 5 5 Control Acetate 0.395
## 6 6 Control Acetate 0.643
## 7 7 Control Acetate 0.505
## 8 8 Control Acetate 0.660
## 9 9 Control Acetate 0.624
## 10 10 Control Acetate 0.694
## # ℹ 790 more rows
Perceba que o resultado foi o agrupamento de todos os metabolitos nas variáveis/colunas “Metabolite” e “Concentration”, onde “Metabolite” recebeu o que antes eram os titulos das colunas, ou seja, os nomes dos metabolitos e “Concentration” recebeu o que eram os valores de cada metabolito para cada amostra.
Agora vamos conectar nosso dataframe modificado com a biblioteca grafica para iniciar a produção da imagem.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%ggviolin(x="Class",y="Concentration",fill="Class")
Note o uso do operador %>% após a função
gather(), esse operador chamado de “pipe” conecta 2 funções em um
pipeline onde o resultado da primeira função é passado como o primeiro
argumento da segunda função, o resultado acima é uma forma compacta do
codigo abaixo, com a diferença que o exemplo a seguir usa um objeto
intermediário para armazenar o resultado (também chamado de retorno da
função) da função gather() e em seguida insere esse resultado na função
ggviolin() pertencente ao pacote ggpubr
Não é necessário executar a linha abaxo
exemplo_reorganizado <- gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")
ggviolin(exemplo_reorganizado,x="Class",y="Concentration",fill="Class")
Uma outra dica é que esté mesmo script pode ser aplicado para produzir um boxplot em vez de um violinplot, bastando apenas trocar a função ggviolin() pela função ggboxplot(). A instrução + ylim(0,5) foi adicionada somente para melhorar a visualização da escala, limitando o grafico a plotar apenas o intervalo entre 0 e 5 no eixo y, mas vamos ignora-la por enquanto.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%ggboxplot(x="Class",y="Concentration",fill="Class")+ylim(0,5)
x=“Class” - O argumento x recebe a
variável que irá compor o eixo X do gráfico, como a nossa figura terá os
eixos X e Y respectivamente dados pelos agrupamentos das amostras e as
concentrações dos metabolitos, o valor de x será “group”. Note que
diferente do ggplot o pacote ggpubr requer que os nomes de variáveis
sejam dados do tipo character, representados sempre entre aspas na
linguagem R.
y=“Concentration” - De forma similar ao anterior, este argumento define a variável que irá compor o eixo y do gráfico, neste caso, a variável “Concentration”.
fill=“Class” - Este argumento também mapeia uma propriedade do gráfico de acordo com uma variável, mas desta vez a propriedade é a cor de preenchimento do violinplot, perceba que esta propriedade também foi atribuída a variável “Class”, de forma que cada valor de class se desdobra em um novo violinplot de uma cor diferente dentro do gráfico. Este argumento deve receber uma variável categórica, chamadas de variáveis do tipo factor na nomeclatura do R.
No entanto, a figura atual continua sendo um gráfico univariado, apresentando apenas uma variável grupada de todos os metabolitos, vamos transforma-la em uma figura multivariáda estratificando os boxplots entre todos os metabolitos usando a variável “Metabolite” que criamos usando a função gather(). Para isso faremos uso da função facet_wrap do pacote ggplot2.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")
~Metabolite - O primeiro argumento da função facet_wrap() requer um tipo espécial de operação chamada de fórmula na nomenclatura do R, o sinal “~” indica “por” ou “por cada” na sintaxe de uma fórmula, então este argumento indica que a estratificação do gráfico (Principal uso da função facet_wrap) deverá ser feita “por cada valor” da variável “Metabolite”. Note também que uma vez que o pacote ggplot2 pertence ao ecosistema da Tidyverse, este recebe variáveis nomeadas por simbolo, onde não é necessário (e nem recomendado) colocar os nomes das variáveis entre aspas como ocorre com os dados do tipo character.
scales = “free” - Determina que cada subplot dentro do gráfico deve possuir sua propria escala de maneira “livre”. Experimente retirar esse argumento ou modificar seu valor para suas outras opções: “fixed”, “free_x” e “free_y” e observe as diferenças na forma como os eixos serão montados.
Já temos um gráfico praticamente pronto, mas ainda falta a adição do teste de hipótese e os ajustes dos elementos estéticos. O teste de hipótese pode ser adicionado de duas maneiras por meio do pacote ggpubr, sendo elas as funções geom_pwc (de geom_pairwisecomparison) e stat_compare_means(). Sendo que a primeira como o nome sugere só dá suporte a comparação de pares, executando somente teste T, wilcoxon e os testes de comparação por pares associados a ANOVA como teste HSD de Tukey, teste de dunn e teste de games howell. Caso o boxplot em questão possua mais de 2 grupos deve-se usar stat_compare_means() que permite os testes de ANOVA e Kruskal-wallis.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc()
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+stat_compare_means()
Perceba também a pequena diferença na representação dos valores de p entre as duas funções. O pacote ggpubr também seleciona automaticamente o metodo com base nos dados, mas isso pode ser facilmente alterado pelo argumento method presentes em ambas as funções.
Além disso a função stat_compare_means possui o argumento paired do tipo booleano (Recebe TRUE ou FALSE) que seleciona se o teste será pareádo ou não quando o metodo escolhido for t.test ou wilcox.test.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+stat_compare_means(method = "t.test",paired = TRUE)
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+stat_compare_means(method = "t.test")
Uma possibilidade interessante ainda é representar os valores de p na forma de estrelas e representar apenas os valores significativos, opções configuradas, respectivamente, pelos argumentos label e hide.ns presente em ambas as funções
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)
Além disso, quando executando multiplos testes é interessante incluir a correção por multiplas hipóteses na geração dos valores de p, isso requer o uso de uma nova função do ggpubr chamada ggadjust_pvalue. Perceba que esta função nao suporta o sistema de camadas do pacote ggplot e não deve ser adicionada com o sinal de + como as demais camadas do ggplot2, devendo usar um objeto intermediário para armazenar o grafico e passa-lo a função ggadjust_pvalue().
p <- gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)
ggadjust_pvalue(p,label="p.adj.signif",p.adjust.method = "bonferroni",hide.ns = TRUE)
Para metabolômica, no entanto, o metodo de correção por false discovery rate (FDR) é mais indicado na literatúra, portanto o metodo de ajuste deve ser modificado.
p <- gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)
ggadjust_pvalue(p,label="p.adj.signif",p.adjust.method = "fdr",hide.ns = TRUE)
Segue a lista de metodos suportados para ajuste do valor de p:
Lembrando que quando usando ANOVA ou Kruskal-Wallis as funções stat_compare_means() e geom_pwc() podem ser usadas em conjunto, uma vez que a primeira irá computar o valor de p global e a segunda irá computar o teste de post-hoc associada a ANOVA fazendo as comparações por pares de grupos. Nestes casos, o metodo usado no geom_pwc() deve ser “tukey_hsd” ou “games_howell_test” e não requer uso das correções de valor de p como FDR e bonferroni já que estes testes de post-hoc já consideram a penalização por repetição do teste.
#Exemplo de uso
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+stat_compare_means(method = "anova")+geom_pwc(method = "tukey_hsd",label="p.signif",hide.ns = TRUE)
Voltaremos a atenção agora para os aspectos estéticos do gráfico, ajustando os detalhes refenrentes as cores, legendas e eixos.
É possível adicionar uma nova camada de informações sobrepondo uma nova forma geometrica, no exemplo abaixo a função geom_point() pertencente ao ggplot2 adiciona os pontos das amostras individuais em cada grupo. O argumento color aqui define de forma específica a cor dos pontos.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black")
Note também que uma vez que a cor preta não diz respeito a uma
propriedade mapeada por uma variável presente nos dados, esta virá fora
da função aes() como normalmente ocorre no ggplot2.
No exemplo anterior os pontos aparecem sobrepostos e enfileirados, isso
pode ser corrigido adicionando um pouco de ruído horizontal através do
argumento position que recebe uma função como
seu valor a depender do tipo de alteração a ser realizada na posição do
elemento. Também ajustaremos a transparencia do elemento através do
argumento alpha para 70%, facilitando a
visualização dos violinplot atrás dos pontos.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)
É importante notar também que cada elemento adicionado ao final do script é adicionado no plano mais “externo”, logo os pontos são posicionados na frente dos violinplot.
O proximo passo é ajustar cores, no ggplot elementos como cores, preenchimento, forma, tamanho e transparência são tratados da mesma forma que os eixo dos graficos e possuem os mesmos argumentos. Cada um destes elementos possui uma camada de escala que são organizados por um grupo de funções com identificadas pelo prefixo “scale”. Para ajustar a cor de preenchimento dada pelo mapeamento da variável Class, devemos ajustar a “escala” do elemento fill, utilizando para isso a função scale_fill_manual, o sufixo “manual” aqui indica que estamos sobrepondo a escala gerada pelo R com uma escala manual personalizada. Existem 3 principais argumentos recebidos pelas escalas, values que coordena os valores recebidos por cada elemento da escala (Neste caso as cores em si), labels que coordena como os elementos dessa escala serão representados na legenda e breaks que coordena quantos e quais elementos a escala possui (Neste caso, quantas cores fill irá mapear).
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("green","red"),labels=c("CG","EG"))
No exemplo acima, a escala recebeu como valores as novas cores atribuidas aos grupos na ordem ao qual eles estão dispostos. O argumento labels modificou as representações das cores de preenchimento dos dois grupos na legenda. Perceba que a legenda é diretamente conectada a escala dos elementos estéticos, isso fica claro quando retiramos o argumento fill de ggviolin() e a legenda deixa de existir.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("green","red"),labels=c("CG","EG"))
Para uma maior liberdade na seleção das cores, uma otima opção é usar o codigo hexadecimal de cores, encontrado facilmente em qualquer paleta de cores online. Permitindo um fino controle das tonalidades usadas
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))
Note que apesar do ajuste ter afetado a legenda, a identificação dos grupos no eixo x permance inalterada, isso porque os eixos, assim como os elementos estéticos possuem sua propria escala, devendo ser também atualizada. Uma vez que não iremos modificar os valores da escala do eixo X, mas somente sua representação, não há necessidade de transformar a escala em uma escala manual, portanto, o sufixo nesse caso será dado de acordo com o tipo de escala (discreta/categórica ou continua/numérica).
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))
Como exemplo podemos modificar a escala do eixo Y para ajustar o número de pontos no eixo, apesar de que em um gráfico usando facet_wrap() com escala livre isso nao funciona muito bem. Neste caso considerando que o eixo Y é numérico/continuo o sufixo será “continuous”
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))+scale_y_continuous(breaks = c(1:6))
Enquanto breaks muda diretamente quantas quebras existem no eixo, labels irá alterar apenas como estes pontos serão representados e limits irá alterar os limites inferior e superior da escala.
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))+scale_y_continuous(breaks=seq(0.2,1,0.2),labels = c(1,0,0.4,0.6,1))
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))+scale_y_continuous(limits = c(0.1,1))
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))+scale_y_continuous(limits = c(0,8))
Perceba que labels não pode possuir mais valores que breaks já que não é possivel representar um ponto na escala que não existe.
Com isso chegamos ao resultado final, bastando apenas salvar o resultado em um arquivo para ser exportado.
png("/Documentos/Boxplot.png",res = 300,width = 6200,height = 3800,units = "px")
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))
dev.off()
O script acima inicialmente abre uma “conexão” com um arquivo png no sistema, indicando seu caminho e nome de salvamento “/Documentos/Boxplot.png”. O argumento res irá definir o DPI da figura, width e height suas dimensões e units especifíca a unidade destas dimensões, neste caso, pixels. Após isso a figura deve ser gerada a fim de ser gravada no sistema e a função dev.off() ao final encerra a conexão e de fato grava o gráfico no arquivo. O formato da figura pode ser facilmente alterada modificando a função que abre a conexão e a extensão do arquivo. Por exemplo:
tiff("/Documentos/Boxplot.tiff",res = 300,width = 6200,height = 3800,units = "px")
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))
dev.off()
pdf("/Documentos/Boxplot.pdf",width = 8,height = 8)
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))
dev.off()
svg("/Documentos/Boxplot.svg",width = 8,height = 8)
gather(exemplo_boxplot,-Samples,-Class,key="Metabolite",value="Concentration")%>%
ggviolin(x="Class",y="Concentration",fill="Class")+
facet_wrap(~Metabolite,scales = "free")+geom_pwc(label="p.signif",hide.ns = TRUE)+
geom_point(color="black",position = position_jitter(width = 0.2),alpha=0.7)+
scale_fill_manual(values=c("#15A113","#F70922"),labels=c("CG","EG"))+
scale_x_discrete(labels=c("CG","EG"))
dev.off()
Note que PDF e SVG não são formatos de bitmap e não possuem o parametro de DPI (Já que não são compostos por pixels) e suas dimensões são obrigatóriamente dadas em polegadas, dispensando o argumento units.