控制ggplot2中具有多个几何的可视对象的绘图顺序

geo*_*ory 5 r ggplot2

我希望ggplot以特定的顺序绘制,以控制对象重叠时可见的内容.每个数据行映射到2个几何图层的合成 - 图的细节需要这样.我一直在使用循环来做到这一点,但它很慢.我想知道是否有更好的方法?例如

d = data.frame(x=c(1,5,2,2,4,2), y=c(1,1,4,3,3,5), grp=c(1,1,1,2,2,2))

ggplot(d, aes(x, y, group=grp)) + 
  geom_polygon(aes(fill = factor(grp))) +
  geom_line(size=1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

每个多边形线应与其多边形一起绘制 - 例如,红色多边形的线应该被蓝色多边形遮挡.有没有办法在没有循环的情况下实现这一点geom_polygongeom_line使用相同的数据集?


编辑:循环方法..

这是我用过的循环方法.添加了更好的数据集来比较性能.两者都需要大约5.6秒才能在我的机器上运行.相比之下,典型的方法(ggplot(d, aes(x, y, fill=factor(grp))) + geom_polygon() + geom_line(size=1))需要0.45秒.

d = data.frame(x = sample(-30:30,99,rep=T) + rep(sample(1:100,33),each=3),
               y = sample(-30:30,99,rep=T) + rep(sample(1:100,33),each=3),
               grp = rep(1:33,each=3))

# Method 1 - for loop
p = ggplot()
for(g in unique(d$grp)){
  dat = subset(d, grp == g)
  p = p + geom_polygon(data=dat, aes(x, y, fill = factor(grp))) + 
    geom_line(data=dat, aes(x, y), size=1)
}
print(p)

# Method 2 - apply
ggplot() + lapply(unique(d$grp), FUN=function(g){
  dat = subset(d, grp == g)
  list(geom_polygon(data=dat, aes(x, y, fill = factor(grp))),
       geom_line(data=dat, aes(x, y), size=1))
})
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Mat*_*ina 1

我刚刚使用了你的代码并改变了图层的顺序,ggplot2 它看起来像这样

d = data.frame(x=c(1,5,2,2,4,2), y=c(1,1,4,3,3,5), grp=c(1,1,1,2,2,2))

ggplot(d, aes(x, y, group=grp)) +
   geom_line(size=1)+
   geom_polygon(aes(fill = factor(grp)))
Run Code Online (Sandbox Code Playgroud)

结果就是这个

在此输入图像描述

另请注意,如果删除该geom_line调用,则会产生相同的结果,但没有边框。