[r] grid.arrange () 플롯을 파일로 저장

여러 개의 플롯을 사용하여 플롯하려고 ggplot2사용하여 배열, grid.arrange(). 내가 가진 정확한 문제를 설명하는 사람을 찾았 기 때문에 링크 의 문제 설명에서 인용했습니다 .

내가 ggsave()후에 사용할 때 grid.arrange(), 즉

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

그리드 플롯을 저장하지 않고 마지막 개별 ggplot을 저장합니다. 또는 이와 유사한 것을 grid.arrange()사용하여
표시된대로 플롯을 실제로 저장하는 방법이 ggsave()있습니까? 예전 방식을 사용하지 않는 것

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

동일한 링크가 아래 솔루션을 제공합니다.

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

그러나 링크 에서 가져온 다음 코드로 호출 ggsave()결과를 저장하는 방법을 알 수 없습니다 .grid.arrange()

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



답변

grid.arrange장치에 직접 그립니다. arrangeGrob반면에, 아무것도 그리지 않고 grob를 반환하여 g전달할 수 있습니다.ggsave(file="whatever.pdf", g) 있습니다.

ggplot 객체와 다르게 작동하는 이유는 기본적으로 마지막 플롯이 지정되지 않은 경우 저장되는 ggplot2가 보이지 않는 최신 플롯을 추적 grid.arrange하기 때문에이 카운터를 패키지 전용으로 엉망으로 만들지 않기 때문 입니다.


답변

babptiste의 제안에 문제가 있었지만 마침내 얻었습니다. 사용해야 할 내용은 다음과 같습니다.

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

이것은 잘 작동합니다.


답변

grid.arrange를 pdf 파일로 저장하는 또 다른 쉬운 방법은 pdf ()를 사용하는 것입니다.

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

테이블과 같이 배열에서 ggplots 이외의 것을 병합 할 수 있습니다 …


답변

나는 이것에 덧붙일 가치가 있다고 생각했다. ggsave가 오류를 생성하면서 위와 관련하여 문제가 발생했습니다. “플롯은 ggplot2 플롯이어야합니다”

이 답변 덕분에 : ggplot_build와 ggplot_gtable을 사용한 후 ggsave로 그래프 저장하기
위의 코드를 수정했습니다.

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

위의 줄은 오류를 수정하는 데 필요합니다

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

이제는 잘 작동합니다.


답변

당신은 sortGrob를 사용할 필요가 없습니다. grid.arrange의 결과를 플롯에 직접 할당하고 ggsave를 사용하여 저장하십시오 :

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)


답변

또 다른 간단한 해결책 : grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

당신은 dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()


답변