当我使用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=FALSE
或na.rm=TRUE
,则没有任何区别。
ggplot(test,aes(x,y,fill = z))+ geom_area(stat =“identity”,position =“stack”,na.rm = TRUE) 警告信息: 删除了包含缺失值的3行(position_stack)
ggplot(test,aes(x,y,fill = z))+ geom_area(stat =“identity”,position =“stack”,na.rm = FALSE) 警告信息: 删除了包含缺失值的3行(position_stack)。
显然,无论我正在尝试什么都不行。如何在系列stack_area()
中显示差距?
答案 0 :(得分:4)
似乎问题与值的堆叠方式有关。错误消息告诉您删除了包含缺失值的行,因此您正在绘制的数据中没有间隙。
但是,geom_ribbon
geom_area
是一种特殊情况,会为缺失值留下空白。 geom_ribbon
也会绘制一个区域,但您必须指定最大和最小y值。因此,可以通过手动计算这些值然后使用geom_ribbon()
绘图来完成这一操作。从您的数据框test
开始,我创建了ymin
和ymax
数据,如下所示:
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()
这给出了以下图: