剪裁/切除多边形外的所有内容或用白色填充外部。

4

我有一张有三角形的彩色噪声正方形。
现在,我想让多边形像圣诞节的饼干切割器一样,将这个噪声切成一个三角形,以多边形路径包围。

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

我想出了两个方法:

  • 方法1:使用一个函数来测试像素(彩色噪声)是否落在图形内部。让我们试试!
    问题:边界像素的边缘超出了线条。在这个例子中,这相当微小。您可以通过使多边形线条稍微变大来解决这个问题。
  • 方法2:反转多边形形状(相当于:填充多边形外部),然后用白色填充。
    问题:在绘图预览窗口中,结果看起来就像我想要的。但是当我将其保存为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)

PDF是您唯一的问题吗?对我来说,您正在寻找什么并不清楚。 - Christoph
我想用多边形路径将基于像素的图像包围起来。没有像素应该超出多边形的边界。然后我想将其保存为PDF文件。 - Andre Elrico
据我所理解,你的故事是误导性的(或者是错误的)。你知道自己想要做什么以及想要使用哪些方法。你的问题只是如何将结果保存为PDF格式。 - Christoph
亲爱的克里斯托夫,我试着在最后再次压缩我的问题!是的,我知道我想要什么。但我不知道怎么做,方法1和2是我最好的尝试。不一定要使用它们。 - Andre Elrico
1个回答

5

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

这是一个简单的例子。我们有一个五角星的多边形。我希望星星外面的所有东西都是红色的。

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!您将看到整个图像被填充为红色!

现在让我们将星型路径的方向改为顺时针方向:请注意第二行中的“应用”和“反转”命令:

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,你会发现这一次它成功了!你已经填满了一个特定多边形外的所有内容!


很棒的解决方案!当您想要突出显示具有冲突辖区(例如人口普查区和国会选区)的瓦片时,它自然适用于映射。 - RTS
1
很好,我稍微改了一下以适应我的需求,将栅格限制在凸包内,但效果非常好!按照“顺时针”的方式运行是解决这个问题的关键。 - Roasty247

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接