наложение графиков в ggplot2

Как наложить один график поверх другого в ggplot2, как объясняется в следующих предложениях? Я хочу нарисовать серый временной ряд поверх красного, используя ggplot2 в R (теперь красный находится над серым, и я хочу, чтобы мой график был наоборот). Вот мой код (я генерирую некоторые данные, чтобы показать вам свою проблему, реальный набор данных намного сложнее):

install.packages("ggplot2")
library(ggplot2)

time <- rep(1:100,2)
timeseries <- c(rep(0.5,100),rep(c(0,1),50))
upper <- c(rep(0.7,100),rep(0,100))
lower <- c(rep(0.3,100),rep(0,100))
legend <- c(rep("red should be under",100),rep("grey should be above",100))

dataset <- data.frame(timeseries,upper,lower,time,legend)

ggplot(dataset, aes(x=time, y=timeseries)) +
  geom_line(aes(colour=legend, size=legend)) +
  geom_ribbon(aes(ymax=upper, ymin=lower, fill=legend), alpha = 0.2) +
  scale_colour_manual(limits=c("grey should be above","red should be under"),values = c("grey50","red")) +
  scale_fill_manual(values = c(NA, "red")) +
  scale_size_manual(values=c(0.5, 1.5)) +
  theme(legend.position="top", legend.direction="horizontal",legend.title = element_blank())

person user3577165    schedule 26.04.2014    source источник
comment
Можете ли вы предоставить некоторые примеры данных для фрейма данных?   -  person sriramn    schedule 27.04.2014
comment
используйте параметр alpha в строке геометрии   -  person rawr    schedule 27.04.2014
comment
Я не хочу менять уровень прозрачности одного временного ряда, но хочу, чтобы один из них был выше другого. Теперь вы также можете запустить codenow, я добавил некоторые данные в исходный пост.   -  person user3577165    schedule 27.04.2014
comment
просто поменять порядок. поместите свой оператор geom_line в конец, чтобы слой с серой линией был последним нарисованным и, следовательно, прямо сверху.   -  person Ramnath    schedule 27.04.2014
comment
Я уже пробовал это, и это не работает. Может быть, потому что я также хочу добавить легенду с оператором aes(color=legend, size=legend)?   -  person user3577165    schedule 27.04.2014


Ответы (1)


Преобразуйте данные, которые вы группируете, в фактор и явно установите порядок уровней. ggplot рисует слои в соответствии с этим порядком. Кроме того, рекомендуется сгруппировать коды scale_manual с кодами geom, к которым он применяется, для удобочитаемости.

legend <- factor(legend, levels = c("red should be under","grey should be above"))

c <- data.frame(timeseries,upper,lower,time,legend)

ggplot(c, aes(x=time, y=timeseries)) +
  geom_ribbon(aes(ymax=upper, ymin=lower, fill=legend), alpha = 0.2) +
  scale_fill_manual(values = c("red", NA)) +
  geom_line(aes(colour=legend, size=legend)) +
  scale_colour_manual(values = c("red","grey50")) +
  scale_size_manual(values=c(1.5,0.5)) +
  theme(legend.position="top", legend.direction="horizontal",legend.title = element_blank())

Обратите внимание, что порядок значений в scale_manual теперь соответствует «серому» и «красному».

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

person sriramn    schedule 27.04.2014