2015-04-20 2 views
1

Есть ли возможный способ оттенить область между двумя lines с использованием базы R с учетом этих двух ограничений:Основание R тень между линиями, имеющими Н.

  • Я не могу использовать ggplot2, потому что другие части моего приложения не будет работа (a ShinyclickId ограничение, более конкретно, использование ggplot2clickId не дает реальных значений x и y данных).
  • Я также не могу использовать polygon потому что NA s содержатся в моих данных, что делает «тень», созданный polygon, преждевременно.

Вот SSCCE (за исключением Shiny компонентов):

#my sample data 
vals_time <- c(1:10) 
vals_line1 <- c(8, 9, NA, NA, 7, 8, 7, NA, 9, 4) 
vals_line2 <- c(4, 5, NA, NA, 6, 10, 8, NA, 5, 2) 

#create line graphs without the shade 
plot(x = vals_time, y = vals_line1, type = "l", ylim = c(0,11)) 
lines(x= vals_time, y = vals_line2) 

Вот как я использовал polygon функцию:

polygon(x = c(vals_time, vals_time[10:1]), 
     y = c(vals_line1, vals_line2[10:1]), 
     col = rgb(1, 0, 0, 0.5)) 
+0

Я сейчас думаю о мучительном обходном к этому: найти последовательные наборы х, без НСБА и сделать полигон «тень» для каждого полного набора. Но прежде чем я погружусь в это, есть ли более простой способ? – sober

+1

Пожалуйста, укажите ** минимальный, самодостаточный пример **. Проверьте эти ссылки на общие идеи и как это сделать в R: [** здесь **] (http://stackoverflow.com/help/mcve), [** здесь **] (http: // www. sscce.org/), [** здесь **] (http://adv-r.had.co.nz/Reproducibility.html) и [** здесь **] (http://stackoverflow.com/ вопросы/5963269/как в изготовлении, а-пре-р-воспроизводимый-пример/5963610 # 5963610). – Henrik

+0

Здесь вы идете Хенрик. – sober

ответ

2

Вы можете разделить свои данные, па значения, а затем используйте polygon по расщепленным данным. Сначала я бы создал data.frame. Тогда вы можете splitdata.frame на NA и использовать na.omit, чтобы опустить NA значений. Наконец, для построения данных используйте lapply и polygon.

df <- data.frame(time = vals_time, 
       l1 = vals_line1, 
       l2 = vals_line2) 
plot(x = df$time, y = df$l1, type = "l", ylim = c(0, 11)) 
lines(x = df$time, y = df$l2) 
lst <- lapply(split(df, cumsum(is.na(df$l1))), na.omit) 
lapply(lst, function(d) 
    polygon(x = c(d$time, rev(d$time)), y = c(d$l1, rev(d$l2)), col = rgb(1,0,0,0.5))) 
Смежные вопросы