2017-01-26 1 views
0

ggplot2에서 여러 개의 플롯을 하나의 PDF로 플롯 할 수 있기를 원합니다. 내가 받고있는 오류 메시지를 만드는 재현 가능한 코드를 만들었습니다. 내가받을여러 개의 ggplot2 플롯을 PDF에 결합

m <- matrix(data=cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow=30, ncol=3) 
df <- as.data.frame(m) 
dfs <- stack(df) 
uniqueplot1=ggplot(dfs, aes(x=values)) + geom_density() 
uniqueplot2=ggplot(dfs, aes(x=values)) + geom_density() 

objects=ls() 
plot_search=grep("uniqueplot",objects) 
objects=objects[plot_search] 

pdf("plots.pdf") 
grid.arrange(objects,ncol=2) 
dev.off() 

이 오류는 다음과 같습니다 성공적 grid.arrange와 함께 사용할 수 있도록 올바른 개체 형식으로 항목 objects를 변환하는 방법은

Error in gList(list("uniqueplot1", "uniqueplot2", wrapvp = list(x = 0.5, : 
    only 'grobs' allowed in "gList" 
In addition: Warning message: 
In grob$wrapvp <- vp : Coercing LHS to a list 

있습니까?

편집 : 이것은 단순한 예입니다. 실생활에서 나는 수백 개의 플롯을 생성 할 것이며, 이들 모두를 개별적으로 나열 할 수는 없습니다.

+0

'grid.arrange (uniqueplot1, uniqueplot2, ncol = 2)'이 (가) 작동합니까? –

+0

다른 접근법 : 이전에 RMarkdown을 사용 했습니까? – Wietze314

답변

1

사용 lapply(objects, get) 당신과 함께 ggplot 개체 목록을 만들기 위해 (objects를 포함하고 있기 때문에 두 캐릭터의 벡터 "uniqueplot1" "uniqueplot2" 아니라 기본 개체) 등 다음 예제와 같이

m <- matrix(data = cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow =30, ncol = 3) 
df <- as.data.frame(m) 
dfs <- stack(df) 

uniqueplot1 <- ggplot(dfs, aes(x = values)) + geom_density() 
uniqueplot2 <- ggplot(dfs, aes(x = values)) + geom_density() 
objects  <- ls() 
plot_search <- grep("uniqueplot",objects) 
objects  <- objects[plot_search] 

pdf("plots.pdf") 
gridExtra::grid.arrange(grobs = lapply(objects, get), ncol = 2) 
dev.off() 
+0

ls()를 통해 검색하는 기능을 유지하는 것이 중요합니다. 실제 예제에서는 여러 루프에서 생성 된 수백 개의 플롯이있을 것이므로 개별적으로 모두 나열 할 수는 없습니다. – IcedCoffee

+1

그래,'do.call (gridExtra :: grid.arrange, c (lapply (objects, get), list (ncol = 2)))'를 사용하면된다. 방금 ​​내 대답을 수정했습니다. –

+0

또한 스크립트에서 최종 객체가 두 객체 'uniqueplot1'과'uniqueplot2'를 포함하지 않기 때문에 조심하십시오. 그러나이 두 이름의 벡터입니다. –

0

음, R 관용법은 환경의 직접적인 것이 아니라 목록의 결과를 루프에 저장 한 다음 목록에서 원하는 요소를 선택하는 것입니다. 그런 다음 grid.arrange의 grobs 매개 변수를 사용할 수 있습니다. 이런 식으로, 당신은 당신의 모범에 적응해야 할 것입니다.

myplots <- lapply(variables, function(v) 
       ggplot(ggplot(dfs, aes_string(x=v)) + geom_density() 
names(myplots) <- variables 
plotme <- myplots[grep("pickme", variables)] 
grid.arrange(grobs=plotme, ncol=2) 
관련 문제