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


137

여러 개의 플롯을 사용하여 플롯하려고 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()?

6
사용png(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie

2
아닙니다 print(ggplot())?
IRTFM

@DWin 그래, 아마! :-)
Andrie 2016 년

1
@Andrie 제안하는 것은 효과가 있지만 이미지의 해상도는 매우 낮습니다. 를 ggplot사용하여 단일 을 저장 ggsave()하면 이미지의 해상도가 훨씬 높습니다. grid.arrange()단일 플롯으로 저장된 것처럼 출력을 고해상도 로 저장하는 방법 이 ggsave()있습니까? 예를 들어 옵션을 제공 png(...,height=1600, width=2500)하면 이미지가 매우 흐리게 보입니다.
나는

답변:


142

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

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


3
이것을 시도하면 g가 올바른 유형이 아니라는 오류가 발생합니까?
Jack Aidley

@JackAidley는 최소한의 독립적 인 재현 가능한 예제와 sessionInfo ()를 사용하여 새로운 질문을합니다 (최신 버전의 R 및 패키지가 있는지 확인).
baptiste

3
@DaveX는이 오도 정보를 퍼 뜨리지 마십시오. plot(g)입니다 하지 gtable, 사용을 표시하는 올바른 방법 grid.draw(g)대신.
baptiste

@baptiste 감사 및 재 작업 : 당신이보고 시도하는 경우의 결과를 참고 g <-arrangeGrob(...)print(g)하면 그래픽을 나열하는 텍스트 테이블을 얻을 수는 그래픽이 아닌 객체를. 시도 grid.draw(g)그래픽과 같은 그래픽을 렌더링 할 수 있습니다. –
Dave X

7
ggsave가 더 이상 (일부 또는 전체) grob와 작동하지 않습니다.
vak

47

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

이것은 잘 작동합니다.


24

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 이외의 것을 병합 할 수 있습니다 ...


7

나는 이것에 덧붙일 가치가 있다고 생각했다. 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

이제는 잘 작동합니다.


나는 이것을 필요로했다. 분명히 ggplot2의 개발 버전은 이와 같은 class-test-fault를 제거하지만 현재 CRAN 버전 (2015-10-21)은 제거하지 않습니다.
Dave X

2
이것은 marrangeGrob와 함께 작동하지만 alignGrob 또는 grid.arrange. @ DaveX에서는 작동하지 않습니다. 위 그림과 같이 ggsave를 수정하는 것 외에 다른 작업을 수행해야합니까? 감사!
k13

3

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

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

2

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

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

당신은 dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.