2013-12-08 2 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) 

я немного изменить другой ответ, лучше переставить grobs, установив widths аргумент:

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 или нет, поэтому вы можете добавить dev.off() после команды ggsave. Связанный с этим незначительный вопрос: любая идея, как заменить символы «M» и «F» в заголовке сюжета с мужскими и женскими половыми символами? – user1701545

Смежные вопросы