Ggplot2: как прозрачно оттенять альтернативные дни на сюжете
Что я делаю неправильно здесь, пожалуйста?
Я пытаюсь затенять чередующиеся 24-дневные прямоугольники с прозрачным серым цветом. Но только последний прямоугольник из цикла for обращается (?!?) Если я делаю что-то вручную, а не for-loop, он отлично работает.
Есть ли способ векторизовать это, чтобы избежать цикла 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
Ответы
Ответ 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))
![enter image description here]()