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

时间:2017-07-29 15:54:16

标签: r plot polygon

我想知道为什么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)

enter image description here

2 个答案:

答案 0 :(得分:3)

一个curve

由于polygon连接曲线的起点和终点,因此会产生一些奇怪的形状。从?polygon我们可以看到

  

"假设通过将最后一个点连接到第一个点来关闭多边形。"

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

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

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

enter image description here

一个图中的多个curve

如果要在一个图中放置多条曲线,可能会遇到无法限制轴的问题,如上所示。因此,我们必须深入研究曲线对象的结构(这里是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)

enter image description here

答案 1 :(得分:1)

Loki向您展示了如何填充曲线,但没有解释半曲线填充的原因,如果您希望使用此功能向前移动,这很重要。

因为您给polygon()一条曲线,它会通过绘制一条直线来连接它们来关闭两端。然后它填充曲线和新线之间的空格。

完整的分布上升并下降到y轴上的相同点,创建了一个漂亮的非常精确的曲线。通过停在曲线的顶部,线条将通过方向的变化绘制,在曲线和两侧的线之间留下空隙,polygon()填充它们。