ggplot2: как прозрачно затенить чередующиеся дни на графике

Что я делаю неправильно здесь, пожалуйста? Я пытаюсь закрасить чередующиеся 24-часовые ежедневные прямоугольники прозрачным серым цветом. Но рисуется только последний прямоугольник из цикла for (?!?). Если я делаю что-то вручную, а не с помощью цикла for, он работает нормально.

Есть ли способ векторизовать это, чтобы избежать цикла for? (И можно ли это сделать с помощью qplot?) Я новичок в ggplot2, и да, я прочитал сайт, книгу и примеры Хэдли.

Вторая проблема: альфа-настройка эстетики не препятствует тому, чтобы прямоугольники перекрывали фон. Как добиться прозрачности?

dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192))
# (ymin, ymax are computed for this series using min/max(na.rm==TRUE))
ymax <- 5.0
ymin <- 0.0
p <- ggplot(dat, aes(x=my_x_series,alpha=0.9)) 
alternate_daily_bars_xmin <- c(4,52,100,148)

for (shade_xmin in alternate_daily_bars_xmin) {
    shade_xmax <- min(shade_xmin+24, 192) # clamp at end of x-range
    p <- p + geom_rect(aes(alpha=0.5,xmin=shade_xmin,xmax=shade_xmax,ymin=ymin,ymax=ymax), fill='gray80')
}
p <- p + geom_point(aes(y=my_y_series))
p

person smci    schedule 12.05.2012    source источник
comment
Добавлено случайное определение dat для воспроизводимости. Это синтаксис команды, который бьет меня. Я предполагаю, что каждый geom_rect переопределяет последний вместо компоновки, как вы могли бы ожидать.   -  person smci    schedule 12.05.2012


Ответы (1)


Чтобы построить прямоугольники, создайте фрейм данных, где каждая строка содержит координаты одного прямоугольника. Эта конструкция работает для всех полигонов, а не только для прямоугольников. Зная это, легко избежать петли.

Затем просто будьте осторожны, сопоставляете ли вы переменную с эстетикой или нет. В вашем случае вам нужно установить alpha на любое значение, которое вы хотите, поэтому оно не является частью настроек aes().

library(ggplot2)

dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192))
rect_left <- c(4,52,100,148)
rectangles <- data.frame(
  xmin = rect_left,
  xmax = rect_left + 24,
  ymin = 0,
  ymax = 5
)

ggplot() +
  geom_rect(data=rectangles, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), 
            fill='gray80', alpha=0.8) +
  geom_point(data=dat, aes(x=my_x_series, y=my_y_series))

введите здесь описание изображения

person Andrie    schedule 12.05.2012
comment
Скорее всего, все, но я никогда не заморачивался с qplot. ggplot на самом деле не так сложно научиться, и вы всегда точно знаете, что получите. Извини. - person Andrie; 13.05.2012