2015-08-10 2 views
1

У меня есть следующий простой линейный график с лентами, обозначающими пороговые значения по оси y.лента ggplot с постоянными `ymin` и` ymax`

library(ggplot2) 
main.df <- data.frame(time = c(1:20, 1:20), 
       level = runif(40), 
       type = c(rep('A', 20), rep('B', 20))) 

gg <- ggplot(main.df, aes(x = time, y = level, colour = type)) 
gg + geom_ribbon(ymin = 0.1, ymax = 0.25, fill = 'green') + 
    geom_ribbon(ymin = 0.25, ymax = 0.5, fill = 'yellow') + 
    geom_ribbon(ymin = 0.5, ymax = 0.95, fill = 'red') + 
    geom_line() 

Desired ggplot but not desired method

Я сделал много попыток, чтобы установить data свойство geom_ribbon, чтобы дать мне больше гибкости и очистить свой код. Вот один из таких примеров.

rib.df <- data.frame(low = c(0.1, 0.25, 0.5), high = c(0.25, 0.50, 0.95), 
        lab = c('green', 'yellow', 'red')) 

gg + geom_ribbon(data = rib.df, 
     aes(ymin = low, ymax = high, fill = lab), 
     inherit.aes=FALSE) + geom_line() 

У этой особой ошибки, что отсутствует эстетическая x. Что интересно не было проблемой в предыдущем примере. Я пробовал установить x и y в нем, кажется, каждая комбинация внутри aes и нет. Я также не понимаю, почему иногда geom_ribbon хочет y, когда он не является необходимой эстетикой.

Мой вопрос в целом: как позвонить geom_ribbon, установив аргумент data для достижения результата, аналогичного приведенным выше ручным вызовам?

Я также буду рад узнать об эффективных способах достижения аналогичного визуального результата с использованием других geom.

ответ

4

Я хотел бы сделать это следующим образом:

rib2 = rbind(rib.df, rib.df) 
rib2$x = rep(c(-Inf, Inf), each = nrow(rib.df)) 

gg + geom_ribbon(data = rib2, 
     aes(x = x, ymin = low, ymax = high, fill = lab), 
     inherit.aes=FALSE) + 
    geom_line() 

ленты сделаны иметь Ymin и уты значение которые изменяют для различных значений х. В этом случае, когда вы просто рисуете прямоугольники, вы можете упростить, используя geom_rect, и в этом случае вы можете установить xmin = -Inf, xmax = Inf за пределами aes() и использовать rib.df со своего вопроса. Таким образом, вам не нужно удвоить данные, чтобы показать, что ymin и ymax одинаковы при значениях min и max x.

gg + geom_rect(data = rib.df, 
      aes(ymin = low, ymax = high, fill = lab), 
      xmin = -Inf, xmax = Inf, 
      inherit.aes=FALSE) + 
    geom_line() 
Смежные вопросы