使用facet,geom_vline和NAs

时间:2016-03-23 15:35:22

标签: r ggplot2

当我运行下面的代码时,我会在下面得到更多错误。

library(ggplot2)
d = data.frame(id=rep(c(1,2),each=3),x=c(1:3,1:3),y=2:7,z=as.numeric(rep(NA,6)))
g = ggplot(d,aes(x,y))
g = g + geom_point() + geom_line()
g = g + geom_vline(aes(xintercept=z))
g = g + facet_wrap(~id)
print(g)

ERROR:

Error in FUN(X[[i]], ...) : subscript out of bounds
In addition: Warning message:
Removed 6 rows containing missing values (geom_vline). 

我理解上面的代码有点傻,但它应该有效。在实践中,通常我对z中的某些数字使用数值,而对于其他数字则为NA,但是当我获取数据的子集时,有时我会有所有的NA,这会导致上面的错误。当我使用旧版本的ggplot2时,我没有遇到这个问题。

可以修复吗?

2 个答案:

答案 0 :(得分:1)

问题在于您的界限:

g = g + geom_vline(aes(xintercept=z))

因为z在每种情况下都是NA,所以会产生错误。如果至少有一个值是实数,则不会收到此错误。删除它,其余工作正常。

正如您在问题中所说,无论值是否都是NA,您都希望代码始终有效。您可以通过替换:

来实现此目的
g = g + geom_vline(aes(xintercept=z))

带有if语句:

if (!all(is.na(z))) g <- g + geom_vline(aes(xintercept=z))

现在,如果您的z列是所有NA,则代码将忽略geom_vline调用。

z <- c(NA, NA, NA, NA, NA, NA)
d = data.frame(id=rep(c(1,2),each=3),x=c(1:3,1:3),y=2:7,z=as.numeric(z))
g = ggplot(d,aes(x,y))
if (!all(is.na(z))) g <- g + geom_vline(aes(xintercept=z))
g = g + geom_point() + geom_line()
g = g + facet_wrap(~id)
print(g)

enter image description here

答案 1 :(得分:0)

更新到ggplot2 2.1.0(和R 3.2.4)解决了这个问题。