2013-12-08 33 views
2

我發佈了這個問題earlier但事實證明,我確認的答案有一個問題,所以我再次發佈這個問題並希望得到一個解決方案。在ggplot2的圖例下插入一個表格

我有以下data.frame我想打印到文件,GGPLOT2:

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作爲參數。你應該定義爲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:

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