为什么 R 中的多边形适用于全曲线而不适用于半曲线?

Why polygon in R works with a full curve but not with a half curve?

我想知道为什么 polygon() 使用双侧曲线(底部图片)效果很好,但是无法正确处理相同曲线的一半(上图)?

感谢简短的解释。

par(mfrow = c(2, 1))

gg = curve(dnorm(x), -4, 0) # Not working!
polygon(gg, col = 2)

gg = curve(dnorm(x), -4, 4) # Working!
polygon(gg, col = 2)

一个curve

由于 polygon 连接了曲线的起点和终点,因此它创建了一些奇怪的形状。从?polygon我们可以看出

"It is assumed that the polygon is to be closed by joining the last point to the first point."

第一个和最后一个点由 curve 中的 fromto 值给出。在您的第一种情况下,这些是 -40

只需将 xlimxaxs = "i" 添加到 curve()

gg = curve(dnorm(x), -4, 4, xlim = c(-4,0), xaxs = "i") # Working!
polygon(gg, col = 2)

一个图中有多个 curves

当你想在一个图中放置多条曲线时,你可能会遇到无法如上所示限制坐标轴的问题。因此,我们必须更深入地挖掘曲线对象的结构(这里 gg)。

让我们先创建两条曲线。

gg = curve(dnorm(x), -4, 4) ; 
polygon(gg, col = 2) ; 
gg = curve(dnorm(x), -4, 0, xlim = c(-4,0), xaxs = "i", add = T) ; 

现在我们来看看gg

gg 
# $x
# [1] -4.00 -3.96 -3.92 -3.88 -3.84 -3.80 -3.76 -3.72 -3.68 -3.64 -3.60 -3.56 -3.52 -3.48 -3.44 -3.40 -3.36 -3.32 -3.28
# [20] -3.24 -3.20 -3.16 -3.12 -3.08 -3.04 -3.00 -2.96 -2.92 -2.88 -2.84 -2.80 -2.76 -2.72 -2.68 -2.64 -2.60 -2.56 -2.52
#  .....
# $y
# [1] 0.0001338302 0.0001569256 0.0001837125 0.0002147280 0.0002505784 0.0002919469 0.0003396012 0.0003944025 0.0004573148
# [10] 0.0005294147 0.0006119019 0.0007061107 0.0008135212 0.0009357722 0.0010746733 0.0012322192 0.0014106023 0.0016122275
#  .....

我们看到 gg 只是 $x$y 坐标的列表。因此,我们可以将 0, 0 处的一个坐标添加到第二个 gg 处的坐标以模拟重叠的第二条曲线的末端。之后两条曲线都被正确绘制。

gg$x <- c(gg$x, 0)
gg$y <- c(gg$y, 0)
polygon(gg, col = 4)

Loki 向您展示了如何根据需要填充曲线,但没有解释为什么半条曲线会这样填充,如果您希望继续使用此功能,这一点很重要。

因为您给 polygon() 一条曲线,所以它通过画一条直线连接它们来闭合两端。然后它填充曲线和新线之间的空间。

完整分布上升和下降到 y 轴上的同一点,形成一条漂亮的填充曲线。通过停在曲线的顶部,通过方向的变化绘制线,在曲线和两侧的线之间留下空隙,polygon() 填充它们。