R - 将图添加到facetted ggplot2对象(使用annotation_custom)

时间:2013-10-30 15:37:02

标签: r ggplot2

我正在尝试使用ggplot2annotation_custom来绘制情节(该情节实际上是我用来替换图例的地图)。但是,我也使用facet_wrap生成多个面板,但与annotation_custom一起使用时,会重现每个面中的绘图。是否有一种简单的方法只插入一次图,最好是在绘图区外?

这是一个简短的例子:

#Generate fake data
set.seed(9)
df=data.frame(x=rnorm(100),y=rnorm(100),facets=rep(letters[1:2]),
              colors=rep(c("red","blue"),each=50))
#Create base plot
p=ggplot(df,aes(x,y,col=colors))+geom_point()+facet_wrap(~facets)
#Create plot to replace legend
legend.plot=ggplotGrob(
  ggplot(data=data.frame(colors=c("red","blue"),x=c(1,1),y=c(1,2)),
         aes(x,y,shape=colors,col=colors))+geom_point(size=16)+
         theme(legend.position="none") )
#Insert plot using annotation_custom
p+annotation_custom(legend.plot)+theme(legend.position="none") 
#this puts plot on each facet!

这会产生以下情节: plot1 当我想要更多的东西: plotideal 任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

annotation_custom()的帮助下,它被称为注释"are the same in every panel",因此预期结果会在每个方面(面板)中包含您的legend.plot。

一种解决方案是将theme(legend.position="none")添加到基础图中,然后使用grid.arrange()(库gridExtra)绘制两个图。

library(gridExtra)
p=ggplot(df,aes(x,y,col=colors))+geom_point()+facet_wrap(~facets)+
         theme(legend.position="none") 

grid.arrange(p,legend.plot,ncol=2,widths=c(3/4,1/4))

enter image description here