Этот вопрос строится на How can i provide shades between dates on x axis in R plot? и How to align multiple ggplot2 plots and add shadows over all of them.Затенение много разных частей в ggplot2
Прежде чем я углубится в детали, я хочу сконденсировать количество кода, которое мне нужно было бы написать, чтобы затенять множество разных разделов. Я надеюсь, что смогу передать всю эту информацию в один кусок кода.
Вот мой MWE:
library(ggplot2)
library(scales)
set.seed(1)
data <- data.frame(Date = seq(as.Date('2000-01-01'),
len= 23, by="1 day"),
Value = sample(1:50, 23, replace=TRUE))
rect1 <- data.frame(xmin=as.Date('2000-01-03 12:00:00'),
xmax=as.Date('2000-01-04 12:00:00'),
ymin=-Inf,
ymax=Inf)
rect2 <- data.frame(xmin=as.Date('2000-01-10'),
xmax=as.Date('2000-01-11'),
ymin=-Inf,
ymax=Inf)
rect3 <- data.frame(xmin=as.Date('2000-01-17 00:00:00'),
xmax=as.Date('2000-01-18 00:00:00'),
ymin=-Inf,
ymax=Inf)
ggplot() +
geom_line(data=data, aes(x = Date, y = Value)) +
geom_rect(data = rect1, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), alpha = 0.4) +
geom_rect(data = rect2, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), alpha = 0.4) +
geom_rect(data = rect3, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), alpha = 0.4) +
scale_x_date(breaks = date_breaks("1 day"), labels = date_format("%d"))
Таким образом, я получаю сюжет с 3 различными затененных областей:
Имея 3 секции в тени не слишком плохо, но что если мне нужно затенять 100? Есть ли способ не определять 100 кадров данных, а затем добавлять все эти штрихи один за другим?
И, во-вторых, я хочу, чтобы мои оттенки были в середине значения. Но во всех трех спецификациях (rect1
, rect2
и rect3
) каждое затенение начинается со значения для этой даты и заканчивается значением для следующей даты. Любые советы о том, как это сделать?
Thanks @anandthakker Это работает. Один вопрос в вашей точке 1 - 'xmin = от -1' в эффекте оттенков 2 дня вместо одного. Что, если бы я хотел затенять только один день, но сдвиньте это так, чтобы он был сосредоточен в этот день. Например, для 03 января у меня будет панель, как у вас есть, но ваш барабан будет на половину размера и по-прежнему сосредоточен на 03 января. Фактически, я бы пошел с января 02 пополудни - 03 января. Другой ответ делает это, но можно ли это сделать без использования класса POSIXct? – bill999
Выяснил это - используйте 'xmin = from - .5' и' xmax = from + .5'. – bill999