2009-10-29 3 views
13

ggplot2를 사용하여 막대 그래프 패널을 만들었으며 각 그룹의 평균에 세로선을 추가하고 싶습니다.ggplot2의 각 패널마다 다른 가로 채기가있는 세로선을 추가하십시오.

require("ggplot2") 
# setup some sample data 
N <- 1000 
cat1 <- sample(c("a","b","c"), N, replace=T) 
cat2 <- sample(c("x","y","z"), N, replace=T) 
val <- rnorm(N) + as.numeric(factor(cat1)) + as.numeric(factor(cat2)) 
df <- data.frame(cat1, cat2, val) 

# draws a single histogram with vline at mean 
qplot(val, data=df, geom="histogram", binwidth=0.2) + 
    geom_vline(xintercept=mean(val), color="red") 

# draws panel of histograms with vlines at global mean 
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + 
    geom_vline(xintercept=mean(val), color="red") 

가 어떻게 그것을 각 패널의 그룹이 X 절편으로 의미 사용할 수 있습니다 : 그러나 geom_vline()는 각 패널에 대해 동일한 절편 (즉, 지구 평균)를 사용? (평균값의 값을 가진 텍스트 라벨을 텍스트 라인에 추가 할 수 있다면 보너스 포인트가됩니다.)

답변

9

하나의 방법은 이전의 평균값으로 data.frame을 구성하는 것입니다.

library(reshape) 
dfs <- recast(data.frame(cat1, cat2, val), cat1+cat2~variable, fun.aggregate=mean) 
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + geom_vline(data=dfs, aes(xintercept=val), colour="red") + geom_text(data=dfs, aes(x=val+1, y=1, label=round(val,1)), size=4, colour="red") 
13

@ eduardo의 재 작업은 같지만 한 줄로 추측됩니다.

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
    + geom_vline(data=aggregate(df[3], df[c(1,2)], mean), 
     mapping=aes(xintercept=val), color="red") 
    + facet_grid(cat1~cat2) 

alt text http://www.imagechicken.com/uploads/1264782634003683000.png

또는 (ggplot의 저자, ​​해들리에 의해 require(plyr) 패키지) plyr를 사용하여이 :

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
    + geom_vline(data=ddply(df, cat1~cat2, numcolwise(mean)), 
     mapping=aes(xintercept=val), color="red") 
    + facet_grid(cat1~cat2) 

내가 ', vline는 측면에서 절단되지 않도록 만족스럽지 못한 것 같다 왜 모르겠어요.

관련 문제