2015-09-12 3 views
1

Я хочу, чтобы выделить определенные области ggplot2 графа подобно тому, как это сделано здесь: How to highlight time ranges on a plot?выделить области в пределах определенного х диапазона в ggplot2

У меня есть вектор V 0 0 1 1 1 ..., который указывает каждый раз, хочу ли я, что часть из График выделен, да или нет. То есть, вопреки вышеизложенному вопросу, у меня нет значений xmin и xmax для каждого из диапазонов, которые должны быть выделены, но я также сомневаюсь, что это сработает, так как мне нужно выделить более одного диапазона.

Есть ли способ написать заявление сюжета для выделения с чем-то вроде dates[v == 1] (даты - это вектор с датами для оси x графика)? Если нет, есть ли еще один хороший способ сделать это?

+2

Почему вы не добавить минимальный рабочий пример кадра данных и кода ggplot2 насколько вы пошли, чтобы помочь людям помочь вам. – lawyeR

ответ

6

Использование diff, чтобы получить регионы для цветных прямоугольников, остальное довольно просто.

## Example data 
set.seed(0) 
dat <- data.frame(dates=seq.Date(Sys.Date(), Sys.Date()+99, 1), 
        value=cumsum(rnorm(100))) 

## Determine highlighted regions 
v <- rep(0, 100) 
v[c(5:20, 30:35, 90:100)] <- 1 

## Get the start and end points for highlighted regions 
inds <- diff(c(0, v)) 
start <- dat$dates[inds == 1] 
end <- dat$dates[inds == -1] 
if (length(start) > length(end)) end <- c(end, tail(dat$dates, 1)) 

## highlight region data 
rects <- data.frame(start=start, end=end, group=seq_along(start)) 

library(ggplot2) 
ggplot(data=dat, aes(dates, value)) + 
    theme_minimal() + 
    geom_line(lty=2, color="steelblue", lwd=1.1) + 
    geom_point() + 
    geom_rect(data=rects, inherit.aes=FALSE, aes(xmin=start, xmax=end, ymin=min(dat$value), 
       ymax=max(dat$value), group=group), color="transparent", fill="orange", alpha=0.3) 

enter image description here

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