2013-12-08 7 views
2

에 범례 아래 테이블 삽입이 질문에 게시 된 earlier하지만 확인 된 대답에는 문제가 있으므로이 문제를 해결하기 위해 다시 게시하고 있습니다.ggplot2

나는 ggplot2와 파일에 플롯 내가하고자하는 data.frame을 다음 있습니다 :

df = data.frame(mean=c(1.96535,2.133604,1.99303,1.865004,2.181713,1.909511,2.047971,1.676599,2.143763,1.939875,1.816028,1.95465,2.153445,1.802517,2.141799,1.722428), 
sd=c(0.0595173,0.03884202,0.0570006,0.04934336,0.04008221,0.05108064,0.0463556,0.06272475,0.04321496,0.05283728,0.05894342,0.05160038,0.04679423,0.05305525,0.04626291,0.0573123), 
par=as.factor(c("p","p","m","m","p","p","m","m","m","m","p","p","m","m","p","p")), 
group=as.factor(c("iF","iF","iF","iF","iM","iM","iM","iM","RF","RF","RF","RF","RM","RM","RM","RM")), 
rep=c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2)) 

이는 ggplot2 객체를 생성하기위한 내 코드입니다 :

p <- ggplot(df,aes(factor(rep),y=mean,ymin=mean-2*sd,ymax=mean+2*sd,color=factor(par))) 
p <- p + geom_pointrange()+facet_wrap(~group, ncol = 4)+scale_color_manual(values = c("blue","red"),labels = c("p","m"),name = "par id") 
p <- p + ggtitle("test") 
p <- p + labs(y="log(y)",x="rep") 

내가 추가적으로이 data.frame을 범례 아래 테이블로 추가하는 것입니다 :

leg.df = data.frame(statistic = c("pp(par)","pp(g)","pp(s)","fc(p/m)"), value = c(0.96,0.94,0.78,1.5)) 

leg.df.grob <- tableGrob(leg.df, gpar.coretext =gpar(fontsize=8), 
     par.coltext=gpar(fontsize=8), 
     gpar.rowtext=gpar(fontsize=8)) 

### final result 
library(gridExtra) 
pp <- arrangeGrob(p + theme(legend.position = "none"), 
        arrangeGrob(leg.df.grob, legend), ncol = 2) 

그리고, 이론적으로, 내가 사용, 예를 들어, 파일에 pp을 저장할 수 있습니다 : 불행하게도

ggsave('plot.png',pp) 

명령 :

pp <- arrangeGrob(p + theme(legend.position = "none"), 
         arrangeGrob(leg.df.grob, legend), ncol = 2) 

을 그 일이 솔루션 플롯 장치가 열립니다 (정확하게 피하려고하는 것입니다). 또한이 오류가 발생합니다 :

Error in arrangeGrob(leg.df.grob, legend) : input must be grobs! 

어떻게 해결할 수 있습니까?

+0

당신은 두 번 같은 질문을해서는 안된다. 수락 된 솔루션에 문제가있는 경우이를 수락 (선택 취소)하고 문제에 대한 해답을 설명하십시오. – agstudy

+0

나는 그것에 동의하고 그것에 대해 나쁘다고 느낀다. 그러나 답을 받아들이는 것 말고는 (나는 지금 막 해왔다.) 두 가지 의견을 덧붙여서 며칠 동안 응답을받지 못했다. 그러나 다시 게시하면 많은 조회수와 허용되는 답변을 몇 분 내에 얻을 수 있습니다. – user1701545

답변

4

다른 해결책이 정확합니다. legend 변수를 설정하지 않았기 때문에 오류가 발생했을 것입니다. 그래서 arrangeGrob은 R 함수 legend을 인수로하여 호출됩니다. 나는 약간 다른 대답을 수정

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

더 나은 widths 인수를 설정하여 grobs를 재 배열, : legend과 같이 정의해야합니다

pp <- arrangeGrob(p + theme(legend.position = "none"), 
        widths=c(3/4, 1/4), 
        arrangeGrob(legend,leg.df.grob), ncol = 2) 

enter image description here

+0

고마워. 이제는 작동하지만, 완성을 위해 그래픽 장치가 ggsave를 사용하는지 여부에 관계없이 자동으로 열리도록 추가해야합니다. 따라서 ggsave 명령 다음에 dev.off()를 추가 할 수 있습니다. 관련된 사소한 질문 : 플롯 헤더의 "M"과 "F"문자를 남성과 여성의 성 기호로 대체하는 방법에 대한 아이디어가 있습니까? – user1701545