如何让 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=FALSE
或 na.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
开始,我创建 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()
这给出了以下情节:
当我使用 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) 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
开始,我创建 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()
这给出了以下情节: