2011-08-12 2 views
4

동일한 ggplot2 그래프에 여러 개의 그림을 그리기 위해 grid.arrange를 호출 할 때 먼저 원하는 그래프의 목록을 작성합니다. 그런 다음 in a previous question과 같이 grid.arrange를 호출하는 해당 인수 목록을 작성합니다. 이것은 내 코드입니다 (내 데이터 프레임은 manip이라고 함).값으로 전달 R

args.list <- NULL; 
plot.list <- NULL; 
for (m in names(manip[2:10])) { 
    plot.list <- c(plot.list, list(qplot(manip$side, y=manip[,m],ylab=m)) 
} 
args.list <- c(plot.list, 1, 9) 
names(args.list) <- c(names(manip)[2:10], list("nrow","ncol")) 
do.call(grid.arrange, args.list) 

9 개의 그래프가 완전히 동일하다는 점을 제외하면이 방법이 효과적입니다. 확인 후 데이터가 항상 m=10에 해당하는 것으로 나타났습니다. 그래서 내 생각 엔 m 값은 루프에 할당되지 않았지만 나중에 평가됩니다. 그러나 ylab=m레이블이 올바르게 할당 된이며 모든 그래프에서 다릅니다.

그래서 차이점이 무엇인지, 통역사가 m을 플롯에 대해 평가할 때를 선택하는 방법을 알지 못합니다. 누군가 설명 할 수 있습니까?

+0

패싯을 사용하지 않고 플롯을 개별적으로 빌드하는 이유가 있습니까? – Andrie

+0

@Andrie : 할 수있을 것 같아요.하지만 데이터 프레임을 다시 구성해야합니다. – seb

+0

아마 어렵지 않을 것입니다. 내 대답은 두 접근법을 모두 보여줍니다. Data.frame의 모양을 변경하는 것은 두 개의 추가 명령문이어야합니다. 하나는'reshape2'를로드하고 두 번째는'용해 '합니다. – Andrie

답변

3

먼저 질문에 답한 다음 패싯 플롯을 사용하여 대안을 보여 드리겠습니다.

library(gridExtra) 
manip <- mtcars 
plot.list <- lapply(2:11, 
        function(x)qplot(manip$mpg, y=manip[, x], 
        ylab=names(manip)[x])) 
do.call(grid.arrange, c(plot.list, nrow=10)) 

을 그것은이 추악한 음모 생산 : 편집

다음, 훨씬 단순화, 코드가 작동하는 것 같다 목표를 모른 채 enter image description here


을, 그것을 시도하고 조언을하는 것은 위험합니다. 그럼에도 불구하고 대신에 패싯을 사용하는 것을 고려해 봤습니까?

다음 코드는 훨씬 간단 quiker을 실행하고 해석하기 쉽게 그래프 생성합니다

library(reshape2) 
manip <- mtcars 
mmanip <- melt(manip, id.vars="mpg") 
str(mmanip) 
ggplot(mmanip, aes(x=mpg, y=value)) + 
    geom_point(stat="identity") + 
    facet_grid(.~variable, scales="free") 

enter image description here

+0

아마도 첫 번째 코드는 작동하지 않습니다. 모든 패널의 값은 동일해야합니다. – kohske

+0

@kohske : 정확히 말해서, 그것은 나의 요점이며, 그것은 나의 해결책과 같은 문제를 가지고있다; Andrie : 나는 faceting을 사용하려고 노력할 것이지만, 내가 가져온 문제를 고치는 방법을 아는 것에 여전히 관심이있을 것입니다. – seb

+0

@kohske 잘 보입니다. 편집 된 답변이 효과가 있다고 생각합니다. 접근 방식은 상당히 다르므로 OP는 이것이 그가 염두에 두었던 것임을 검증해야합니다. – Andrie

2

은 아마도 그 다음 데이터를 녹여 패 시팅을 사용하는 것이 좋습니다 것입니까?

library(ggplot2) 
manip <- data.frame(car = row.names(mtcars), mtcars) 
manip.m <- melt(manip) 
qplot(car, value, data = manip.m) + facet_wrap(~variable, scales = "free_y") 

그것은

last_plot() + opts(axis.text.x = theme_text(angle = 90)) 

enter image description here

HTH

4

동작은 다음

R.

의 게으른 평가 때문이다 xlab에 약간의 연마를 필요로하는 것은 최소한의 (?) 예 :

d <- 1:3 

args.list <- NULL; 
plot.list <- NULL; 
for (m in 1:3) { 
plot.list <- c(plot.list, list(qplot(d[m], d[m], ylab=letters[m]))) 
} 

args.list <- c(plot.list, nrow=1, ncol=3) 
do.call(grid.arrange, args.list) 

이 경우 do.call을 호출하면 d[m]이 계산됩니다. 따라서 모든 패널에서 m은 3입니다.여기

이 해결하다이 경우

d <- 1:3 

args.list <- NULL; 
plot.list <- NULL; 
for (m in 1:3) { 
    plot.list <- c(plot.list, 
    list(qplot(d, d, data=data.frame(d=d[m]), ylab=letters[m]))) 
} 

args.list <- c(plot.list, nrow=1, ncol=3) 
do.call(grid.arrange, args.list) 

, d[m]qplot는 통화시 평가되고,이 d[m] qplot 출력 객체에 저장된다.

간단한 해결책은 데이터를 qplot() 또는 ggplot()으로 전달하는 것입니다.

+0

+1이 문제를 명확히 해 주셔서 감사합니다. – Andrie

+0

정말로 감사드립니다. – seb