r - 在 ggplot2 中控制具有多个几何图形的视觉对象的绘图顺序

标签 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)

enter image description here

每条多边形线都应与其多边形一起绘制 - 例如红色多边形的线应该被蓝色的多边形遮挡。当两个 geom_polygon 都没有循环时,有什么方法可以实现这一点吗?和 geom_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))
})

enter image description here

最佳答案

我刚刚使用了您的代码并更改了 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)))
结果是这个
enter image description here
另请注意,如果您删除 geom_line调用你产生相同的结果但没有边界。

关于r - 在 ggplot2 中控制具有多个几何图形的视觉对象的绘图顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33989131/

相关文章:

r - 打包检查时如何有效处理未压缩的保存?

r - 如何从另一个输出访问变量

r - 向 R 条形图添加垂直分隔符和标签

r - ggplot aes_string 不适用于空格

r - loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : there is no package called 'stringi' 中的错误

r - 错误 : package or namespace load failed for ‘gmm’ in dyn. load(file, DLLpath = DLLpath, ...): 无法加载共享对象

r - 有没有办法使用R从excel文件中提取图片?然后可以将其放入 tesseract ocr

r - 需要安装Go才能使用Academic Hugo主题的blogdown

r - 在 ggplot2 中,我可以自动将标题分成多行,而不是使用转义符\n 吗?

r - ggplot : modify coord_cartesian() values dynamically