r - 剪切/剪切多边形外部的所有内容或用白色填充外部

标签 r ggplot2 polygon clip

我有一个带有三角形的彩色噪声正方形。
现在,我希望多边形像圣诞节的“ cookies 切割器”一样减少这种噪音。导致被多边形路径包围的三角形噪声。

如何裁剪与多边形边框重叠的所有像素,然后将其另存为 pdf?

我想出了两个想法:

  • 方法一 使用一个函数来测试像素(有色噪声)是否落在形状中。我们开始做吧!
    问题 :边框像素的边缘出线。在这个例子中,它非常小。您可以争辩说只是使多边形线大一点。
  • 方法二 反转多边形形状(等于:填充多边形外部),然后用白色填充。
    问题 :
    在绘图预览窗口中,结果看起来像我想要的。当我将它保存为 PDF 时,我得到的结果是所有东西都是白色的,带有黑色多边形形状。

  • 可重现的示例 :
    library(magrittr)
    library(ggplot2)
    library(SDMTools)
    polyGony <- c(0,0,100,50,50,100) %>% matrix(ncol=2,byrow = T) %>% as.data.frame()
    deltaN <- 200  #grid width
    sp1<-seq(1,100,length=deltaN)
    sp2<-seq(1,100,length=deltaN)
    sp<-expand.grid(x=sp1,y=sp2)
    
    set.seed(1337)
    sp$z <- sample(1:30,nrow(sp),replace = T)
    
    # Method 1
    outin = SDMTools::pnt.in.poly(sp[,1:2],polyGony)
    outin$z <- sp$z
    pointsInsideTri <- outin[outin$pip==1,-3]
    
    p <- ggplot(pointsInsideTri, aes(x, y)) +
      geom_raster(aes(fill = z)) +
      scale_fill_gradientn(colours=c("#FFCd94", "#FF69B4", "#FF0000","#4C0000","#000000"))
    
    p + geom_polygon(data = polyGony, aes(V1,V2),color="black", fill=NA) + theme(aspect.ratio = 1)
    
    # Method 2
    outSQ <-c(0,0,100,0,100,100,0,100)
    invPolyGony <- c(outSQ,0,0,100,50,50,100) %>% matrix(ncol=2,byrow = T) %>% as.data.frame()
    
    
        p <- ggplot(sp, aes(x, y)) +
          geom_raster(aes(fill = z)) +
          scale_fill_gradientn(colours=c("#FFCd94", "#FF69B4", "#FF0000","#4C0000","#000000"))
    
        p + geom_polygon(data = invPolyGony, aes(V1,V2) ,colour="black", fill="white") + theme(aspect.ratio = 1)
    

    最佳答案

    我现在知道问题出在哪里了。为了填充多边形外部的所有内容,路径(中间的洞)需要顺时针“运行”,外边界需要逆时针运行。

    我做了一个简单的例子。我们有一个星星的多边形。我希望星星之外的一切都是红色的。

    star <- c(25.000,1.000,31.000,18.000,49.000,18.000,35.000,29.000,40.000,46.000,
              25.000,36.000,10.000,46.000,15.000,29.000,1.000,18.000,19.000,18.000) %>% matrix(ncol=2, byrow=T)
    star <- rbind(star,star[1,])
    rim  <- c(0,0, 50,0, 50,50,0,50,0,0) %>% matrix(ncol=2, byrow=T)
    
    datapolyM <- rbind(rim,star) %>% as.data.frame()
    names(datapolyM) <- c("x","y")
    
    ggplot(datapolyM, aes(x=x, y=y)) + 
      geom_polygon(fill="red", colour="black")
    

    导出为pdf!您会看到整个图像都填充为红色!

    现在让我们将星星的路径顺时针旋转:请尊重第二行中的 apply 和 reverse 命令:
    star <- c(25.000,1.000,31.000,18.000,49.000,18.000,35.000,29.000,40.000,46.000,
              25.000,36.000,10.000,46.000,15.000,29.000,1.000,18.000,19.000,18.000) %>% matrix(ncol=2, byrow=T) %>% apply(2, rev)
    star <- rbind(star,star[1,])
    rim  <- c(0,0, 50,0, 50,50,0,50,0,0) %>% matrix(ncol=2, byrow=T)
    
    datapolyM <- rbind(rim,star) %>% as.data.frame()
    names(datapolyM) <- c("x","y")
    datapolyM$id <- "a"
    
    ggplot(datapolyM, aes(x=x, y=y)) + 
      geom_polygon(fill="red")
    

    现在再次导出为pdf。这次你会看到它奏效了!您已填充给定多边形形状之外的所有内容!

    关于r - 剪切/剪切多边形外部的所有内容或用白色填充外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41261785/

    相关文章:

    r - 在 knit 幻灯片中包含由 Hmisc Latex 生成的 latex 表

    r - 在网格中排列 8 个图和一个图例

    r - 添加 geom_rect 时对象消失

    polygon - 在openscad中将圆形变形为椭圆形

    algorithm - 谷歌地图多边形优化

    R dplyr : how to use . .. with summary(across()) when ... 将引用数据中的变量名称?

    r - 如何在 "modelerData"节点中正确制作 "modelerDataModel"和 "Extension Transform (R syntax)"添加多个列

    r - 在 R 中跨行 data.table 查找模式

    r - ggplot2 中的双箱图

    javascript - Google Maps v3 - 删除多边形上的顶点