如何让geom_area()为缺失值留下空隙?

时间:2015-05-08 05:46:46

标签: r ggplot2

当我使用geom_area()绘图时,我希望它的表现与geom_bar()非常相似,但我对这种缺失值的行为感到有些困惑。

    require(dplyr)
    require(ggplot2)

    set.seed(1)

    test <- data.frame(x=rep(1:10,3), y=abs(rnorm(30)), z=rep(LETTERS[1:3],10)) %>% arrange(x,z) 

# I also have no idea why geom_area needs the data.frame to be sorted first.

    test[test$x==4,"y"] <- NA

    ggplot(test, aes(x, y, fill=z)) + geom_bar(stat="identity", position="stack") 

生成此叠加条形图。 Graph using stack_bar()

但是,如果我改为stack_area(),它会插入缺失的值。

> ggplot(test, aes(x, y, fill=z)) + geom_area(stat="identity", position="stack")
Warning message:
Removed 3 rows containing missing values (position_stack). 

Graph using stack_area()

如果我添加na.rm=FALSEna.rm=TRUE,则没有任何区别。

  

ggplot(test,aes(x,y,fill = z))+ geom_area(stat =“identity”,position =“stack”,na.rm = TRUE)   警告信息:   删除了包含缺失值的3行(position_stack)

Graph with na.rm=TRUE

  

ggplot(test,aes(x,y,fill = z))+ geom_area(stat =“identity”,position =“stack”,na.rm = FALSE)   警告信息:   删除了包含缺失值的3行(position_stack)。

Graph with na.rm=FALSE

显然,无论我正在尝试什么都不行。如何在系列stack_area()中显示差距?

1 个答案:

答案 0 :(得分:4)

似乎问题与值的堆叠方式有关。错误消息告诉您删除了包含缺失值的行,因此您正在绘制的数据中没有间隙。

但是,geom_ribbon geom_area是一种特殊情况,会为缺失值留下空白。 geom_ribbon也会绘制一个区域,但您必须指定最大和最小y值。因此,可以通过手动计算这些值然后使用geom_ribbon()绘图来完成这一操作。从您的数据框test开始,我创建了yminymax数据,如下所示:

test$ymax <-test$y
test$ymin <- 0
zl <- levels(test$z)
for ( i in 2:length(zl) ) {
   zi <- test$z==zl[i]
   zi_1 <- test$z==zl[i-1]
   test$ymin[zi] <- test$ymax[zi_1]
   test$ymax[zi] <- test$ymin[zi] + test$ymax[zi]
}

然后用geom_ribbon绘图:

ggplot(test, aes(x=x,ymax=ymax,ymin=ymin, fill=z)) + geom_ribbon()

这给出了以下图:

enter image description here