2015-05-08 3 views
5

Когда я использую geom_area(), я ожидаю, что он будет работать так же, как geom_bar(), но я немного недоумеваю в этом поведении за отсутствующие значения.Как я могу заставить geom_area() оставить пробел для отсутствующих значений?

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") 

Производит эту сложную гистограмму. Graph using 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). 

Graph using stack_area()

Если добавить в na.rm=FALSE или na.rm=TRUE это не имеет никакого значения.

ggplot (тест, AES (х, у, заполнения = г)) + geom_area (стат = "идентичность", позиция = "стек", na.rm = TRUE) предупреждающее сообщение: Удалены 3 строки содержащие пропущенные значения (position_stack)

Graph with na.rm=TRUE

ggplot (тест, АЕС (х, у, заполнения = г)) + geom_area (стат = "идентичность", позиция = "стек", на .rm = FALSE) Предупреждающее сообщение: Удалено 3 строки contai ning missing values ​​(position_stack).

Graph with na.rm=FALSE

Очевидно, что я пытаюсь не работает. Как я могу показать пробел в серии с stack_area()?

ответ

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() 

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

enter image description here

+1

следующий выпуск здесь: http://stackoverflow.com/questions/35454277/can-you-make-geom-ribbon-leave-a-gap-for-mi ssing-значение? answertab = голоса # вкладки-топ – eFF

Смежные вопросы