Как я могу заставить 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_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). 

График с использованием stack_area

Если я добавлю в 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)

График с na.rm = ИСТИНА

ggplot (test, aes (x, y, fill = z)) + geom_area (stat = "identity", position = "stack", na.rm = FALSE) Предупреждающее сообщение: удалены 3 строки, содержащие пропущенные значения (position_stack).

График с na.rm = ЛОЖЬ

Очевидно, что все, что я пытаюсь, не работает. Как я могу показать разрыв в серии с 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()

Это дает следующий сюжет:

введите описание изображения здесь

Другие вопросы по тегам