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

Tom*_*Tom 5 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") 
Run Code Online (Sandbox Code Playgroud)

生成此堆积条形图. 使用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). 
Run Code Online (Sandbox Code Playgroud)

使用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)

使用na.rm = TRUE的图表

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

na.rm = FALSE的图表

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

Sti*_*ibu 6

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

然而,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]
}
Run Code Online (Sandbox Code Playgroud)

然后绘制geom_ribbon

ggplot(test, aes(x=x,ymax=ymax,ymin=ymin, fill=z)) + geom_ribbon()
Run Code Online (Sandbox Code Playgroud)

这给出了以下情节:

在此处输入图片说明