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

How can I make geom_area() leave a gap for missing values?

当我使用 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") 

生成此堆积条形图。

但是,如果我更改为 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). 

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

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

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

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

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

然而,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()

这给出了以下情节: