【问题标题】:Plot intersection of two filled polygons in R在R中绘制两个填充多边形的交集
【发布时间】:2013-12-01 21:21:53
【问题描述】:

x1y1 为等长向量,定义多边形1 的顶点坐标。
x2y2 为等长向量,定义多边形2 的顶点坐标。

以Polygon1为例,可以通过polygon(x1,y1,border=NA,col=rgb(0,0,0))绘制

仅填充同时属于多边形1和多边形2的区域的最简单方法是什么(最好在基本 R 中,即没有任何包)?换句话说,绘制(填充)由多边形 2 裁剪的多边形 1 的最简单方法是什么?

背景:

我正在使用它来为标准绘图下的轮廓(多色)区域着色。每个等高线间区域都需要与绘图下的区域相交。

在我的例子中对多边形的一些限制:

如果重要的话,在我的情况下,多边形 1 可定义为 x 轴和某个 y=f1(x) 之间的区域,而多边形 2 可定义为 y=a*f2(x) 和y=b*f2(x) 其中 a>b.

简单的示例数据:

x1 <- 0:6
y1 <- c(0,1,2,1,0,-1,0)
x2 <- c(x1,rev(x1))
y2 <- c(x1*rev(x1)/5,x1*rev(x1)/10)

【问题讨论】:

  • 请提供一个可重现的例子。
  • 添加的示例数据是否满足您的要求?
  • 是的,一个例子会让测试不同的方法变得更容易。
  • 限制仅使用基础 R 使其变得非常困难。您可以使用另一个包来计算交集并仍然在基础图上使用它。
  • @thelatemail 好的,谢谢;它已被更改为软约束。

标签: r plot polygons


【解决方案1】:

由于您在示例中没有给出明确定义的函数,因此不可能在数学上定义交叉区域。您应该一个一个地手动定义区域。

另一个选项,您可以使用 Alpha 混合来区分区域。

xA <- 0:6
yA <- c(0,1,2,1,0,-1,0)
xB <- c(x1,rev(x1))
yB <- c(x1*rev(x1)/5,x1*rev(x1)/10)
plot(NA,xlim=extendrange(c(xA,xB)),
            ylim=extendrange(c(yA,yB)),xaxs='i',yaxs='i',frame.plot=F)
polygon(x = c(xA,tail(xA,1)), y = c(yA,0),col=rgb(1,0,1,0.5),border="white")
polygon(x = c(xB,tail(xB,1)), y = c(yB,0),col=rgb(1,0,1,0.5),border='white')

【讨论】:

  • 谢谢,这在某些情况下可能很有用,但不幸的是,在我的情况下,我真的只需要遮蔽交叉路口而无需其他任何东西。
【解决方案2】:

这通过用白色填充两个多边形之外的所有内容来绘制必要的多边形。显然,它必须在情节中的所有其他内容之前绘制,并且不能提供透明背景。如果需要在同一个图中绘制多个这样的多边形,这是行不通的。

xlim <- c(min(x1,x2),max(x1,x2))
ylim <- c(min(y1,y2),max(y1,y2))
xlim <- xlim+c(-1,1)*(xlim[2]-xlim[1])*0.04 # extend by 4% on each side
ylim <- ylim+c(-1,1)*(ylim[2]-ylim[1])*0.04 # extend by 4% on each side
n1 <- length(x1)
n2 <- length(x2)
xS <- c(xlim[1],xlim,rev(xlim),xlim[1])
yS <- c(0,rep(ylim,each=2),0)
plot(NA,xlim=xlim,ylim=ylim,xaxs='i',yaxs='i')
polygon(xS,yS,border=NA,col=rgb(0,0,0))
polygon(c(x1,xS),c(y1,yS),border=NA,col=rgb(1,1,1))
polygon(c(x2,xS),c(y2,yS),border=NA,col=rgb(1,1,1))
box()
polygon(x1,y1)
polygon(x2,y2)

所以对我来说,这个答案并没有削减它。但也许它可以在其他人身上播下一些想法的种子,让他们知道如何做到这一点。

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多