2014-02-19 2 views
9

Я могу получить «заполненный» geom_line либо geom_ribbon, либо geom_area. Есть ли эквивалент для geom_step, который не требует возиться с полигонами/баррелями или создавать фактические точки шага? Вот некоторые примерные данные:Сгенерировать заполненный geom_step

library(ggplot2) 
set.seed(1) 
df <- data.frame(
    x=rep(sort(sample(1:20, 5)), 3), 
    y=ave(runif(15), rep(1:3, each=5), FUN=cumsum), 
    grp=letters[rep(1:3, each=5)] 
) 
ggplot(df, aes(x=x, y=y, color=grp)) + geom_step(position="stack") 

Который производит:

enter image description here

В принципе, я хочу точно то же самое, но с залитых областей. Я знаю, как это сделать, фактически создавая значения x/y, необходимые для шагов, и используя geom_area, но я надеюсь, что есть что-то более простое.

ответ

6

Вот ответ, который я имел в виду, для справки, но я надеюсь на что-то более простой/встроенный, если это возможно:

df2 <- rbind(
    df, 
    transform(df[order(df$x),], 
    x=x - 1e-9, # required to avoid crazy steps 
    y=ave(y, grp, FUN=function(z) c(z[[1]], head(z, -1L))) 
)) 
ggplot(df2, aes(x=x, y=y, fill=grp)) + geom_area() 

enter image description here

1

Я знаю, что речь идет о нескольких лет, но сегодня у меня была такая же проблема. Для справки вот мое решение. Это не более краткий, чем исходный ответ, но для некоторых может быть проще понять.

library(ggplot2) 
library(dplyr) 

df <- data.frame(x = seq(10), y = sample(10)) 

df_areaStep <- bind_rows(old = df, 
         new = df %>% mutate(y = lag(y)), 
         .id = "source") %>% 
       arrange(x, source) 

ggplot(df, aes(x,y)) + 
    geom_ribbon(aes(x = x, ymin = 0, ymax = y), data = df_areaStep) 

See this gist for longer version with comments.

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