Estou tentando plotar várias parcelas usando ggplot2
, organizando-as usando grid.arrange()
. Desde que consegui encontrar alguém descrevendo o problema exato que tenho, citei a descrição do problema no link :
Quando eu uso ggsave()
depois grid.arrange()
, ou seja,
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) ggsave("sgcirNIR.jpg")
Eu não salvo o gráfico da grade, mas o último gráfico gg individual. Existe alguma maneira de realmente salvar o gráfico como exibido grid.arrange()
usando
ggsave()
algo semelhante? Além de usar a maneira mais antiga
jpeg("sgcirNIR.jpg") grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) dev.off()
O mesmo link fornece a solução abaixo:
require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly
No entanto, não consigo descobrir como usar ggsave()
para salvar a saída da grid.arrange()
chamada no código a seguir, retirado do link :
library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}
legend <- g_legend(p1)
lwidth <- sum(legend$width)
## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
p2 + theme(legend.position="none"),
main ="this is a title",
left = "This is my global Y-axis title"), legend,
widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)
# What code to put here to save output of grid.arrange()?
png(); grid.arrange(); ggplot(); ggplot(); dev.off()
print(ggplot())
?ggplot
utilizaçãoggsave()
, a resolução da imagem é muito maior. Existe uma maneira de salvar a saídagrid.arrange()
com alta resolução, como seria se fosse uma única plotagem salvaggsave()
? Se eu fornecer, por exemplo, as opções,png(...,height=1600, width=2500)
a imagem parece muito desfocada.Respostas:
grid.arrange
desenha diretamente em um dispositivo.arrangeGrob
, por outro lado, não desenha nada, mas retorna um grobg
, para o qual você pode passarggsave(file="whatever.pdf", g)
.O motivo pelo qual ele funciona de maneira diferente do que com os objetos ggplot, onde por padrão o último gráfico está sendo salvo, se não especificado, é que o ggplot2 invisivelmente acompanha o gráfico mais recente, e acho que não
grid.arrange
deve mexer com esse contador particular do pacote.fonte
plot(g)
é o caminho certo para exibir uma tabela, use em seu lugar.grid.draw(g)
g <-arrangeGrob(...)
com,print(g)
obterá uma tabela de texto listando os objetos gráficos em vez do gráfico. Tentegrid.draw(g)
renderizar o gráfico como gráfico. -Eu tive alguns problemas com a proposta de babptiste, mas finalmente entendi. Aqui está o que você deve usar:
Isso deve funcionar bem.
fonte
Outra maneira fácil de salvar um grid.arrange em um arquivo pdf é usar pdf ():
Permite mesclar outras coisas além de ggplots no arranjo, como tabelas ...
fonte
Eu pensei que valia a pena adicionar a isso. Eu tive problemas com o acima, com o ggsave produzindo um erro: "plot deveria ser um plot ggplot2"
Graças a esta resposta: Salvar um gráfico com o ggsave depois de usar o ggplot_build e o ggplot_gtable Eu tenho uma alteração no código acima.
A linha acima necessária para corrigir o erro
Agora funciona bem para mim.
fonte
Você não precisa usar o organizeGrob, pode atribuir o resultado de grid.arrange diretamente a um gráfico e salvá-lo usando ggsave:
fonte
Outra solução simples: logo após o seu
grid.arrange()
você faz um
dev.copy()
fonte