绘制多边形:限制?

时间:2016-02-12 13:52:28

标签: r graphics

R中的polygon函数看起来相当简单......但我无法让它工作。

它很容易使用此代码:

x <- seq(-3,3,0.01)
y1 <- dnorm(x,0,1)
y2 <- 0.5*dnorm(x,0,1)
plot(x,y1,type="l",bty="L",xlab="X",ylab="dnorm(X)")
points(x,y2,type="l",col="red")
polygon(c(x,rev(x)),c(y2,rev(y1)),col="skyblue")

当把这个用于别的东西时,它不起作用。这里有一些东西可以重现这个问题:

lowerbound = c(0.05522914,0.06567045,0.07429926,0.08108482,0.08624472,0.09008050,0.09288837,0.09492226)
upperbound = c(0.1743657,0.1494058,0.1333106,0.1227383,0.1156714,0.1108787,0.1075915,0.1053178)
lim = c(100,200,400,800,1600,3200,6400,12800)

plot(upperbound, ylim=c(0, 0.2), type="b", axes=FALSE)
lines(lowerbound, type="b", col="red")
atvalues <- seq(1:8)
axis(side=1, at=atvalues, labels=lim)
axis(side=2, at=c(0,0.05,0.1,0.15,0.2), labels=c(0,0.05,0.1,0.15,0.2))
polygon(lowerbound,upperbound, col="skyblue")

当直接调用坐标时仅分割子集时,它也不起作用:

xpoly <- c(100,200,200,100)
ypoly <- c(lowerbound[1], lowerbound[2], upperbound[2], upperbound[1])
polygon(xpoly,ypoly, col="skyblue")

我错过了什么?

1 个答案:

答案 0 :(得分:1)

绘制整个多边形

您需要向x提供ypolygon。通常情况下,您也会为plot执行此操作,但如果您不这样做,则只会将索引用作x,即整数1到n。我们可以使用它来制作x范围。 seq_along将创建一个1:n向量,其中n是另一个对象的length

x <- c(seq_along(upperbound), rev(seq_along(lowerbound)))
y <- c(lowerbound, rev(upperbound))

plot(upperbound, ylim=c(0, 0.2), type="b", axes=FALSE)
lines(lowerbound, type="b", col="red")
atvalues <- seq(1:8)
axis(side=1, at=atvalues, labels=lim)
axis(side=2, at=c(0,0.05,0.1,0.15,0.2), labels=c(0,0.05,0.1,0.15,0.2))
polygon(x = x, y = y, col="skyblue")

enter image description here

绘制子集

对于子集,我首先创建y,然后使用旧x轻松获取`x值:

y2 <- c(lowerbound[1:2], upperbound[2:1])
x2 <- x[which(y2 == y)]
polygon(x2, y2, col="skyblue")

enter image description here

我该怎么做

ggplot2中创建这样的内容要容易得多,其中geom_ribbon可以解决很多问题。我们只需要制作一个实际的data.frame,停止依赖索引。

全多边形:

library(ggplot2)
ggplot(d, aes(x = x, ymin = low, ymax = up)) +
  geom_ribbon(fill = 'skyblue', alpha = 0.5) +
  geom_line(aes(y = low), col = 'red') +
  geom_line(aes(y = up), col = 'black') +
  scale_x_continuous(trans = 'log2') +
  theme_bw()

enter image description here

子集:

ggplot(d, aes(x = x, ymin = low, ymax = up)) +
  geom_ribbon(data = d[1:2, ], fill = 'skyblue', alpha = 0.5) +
  geom_line(aes(y = low), col = 'red') +
  geom_line(aes(y = up), col = 'black') +
  scale_x_continuous(trans = 'log2') +
  theme_bw()

enter image description here