Как я могу заставить geom_area() оставить пробел для пропущенных значений?
Когда я строю график, используя 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()
?
1 ответ
Кажется, что проблема связана с тем, как значения сложены. Сообщение об ошибке сообщает, что строки, содержащие пропущенные значения, были удалены, поэтому в данных, которые вы строите, просто нет пропусков.
Тем не мение, 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()
Это дает следующий сюжет: