применить прозрачный фон, чтобы разделить область графика на основе значений x, используя ggplot - PullRequest
0 голосов
/ 14 декабря 2018

Я был бы признателен за любую помощь, чтобы применить прозрачные цвета фона ниже, чтобы разделить на две части область графика, основанную на значениях x, как показано на графике ниже (вертикальное деление).

Вот мои примеры данных и код:

mtcars$cyl <- as.factor(mtcars$cyl)
ggplot(mtcars, aes(x=wt, y=mpg, color=cyl)) +
  geom_point() + 
  theme(legend.position="none")+
  geom_smooth(method=lm, se=FALSE, fullrange=TRUE)

Вот график, который я хотел бы повторить, и легенда иллюстрирует изменение, которое я хочу реализовать:

enter image description here

Заранее спасибо.

1 Ответ

0 голосов
/ 14 декабря 2018

Я думаю, вы хотите что-то подобное.Вам нужно будет назначить группы и заполнить эту группу в вашем geom_ribbon, и установить ymin и ymax так, как вам нравится.

library(tidyverse)
    mtcars$group <- ifelse(mtcars$wt <= 3.5, "<= 3.5", "> 3.5")
mtcars <- arrange(mtcars, wt)
mtcars$group2 <- rleid(mtcars$group)
mtcars_plot <- head(do.call(rbind, by(mtcars, mtcars$group2, rbind, NA)), -1)
mtcars_plot[,c("group2","group")] <- lapply(mtcars_plot[,c("group2","group")], na.locf)
mtcars_plot[] <- lapply(mtcars_plot, na.locf, fromLast = TRUE)

ggplot(mtcars_plot, aes(x = wt, y = mpg)) +
  geom_point() +
  geom_smooth(aes(), method=lm, se=F, fullrange=TRUE) +
  geom_ribbon(aes(ymin = mpg *.75, ymax = mpg * 1.25, fill = group), alpha = .25) +
  labs(fill = "Weight Class")

Редактировать :

Чтобы отобразить доверительные интервалы с помощью geom_ribbon, вам придется предварительно рассчитать их, используя lm и predict.

mtmodel <- lm(mpg ~ wt, data = mtcars)
mtcars$Low <- predict(mtmodel, newdata = mtcars, interval = "confidence")[,2]
mtcars$High <- predict(mtmodel, newdata = mtcars, interval = "confidence")[,3]

За ним следует предыдущий код для изменения mtcars.Затем построите график с расчетными границами.

ggplot(mtcars_plot, aes(x = wt, y = mpg)) +
  geom_point() +
  geom_smooth(aes(), method=lm, se=F, fullrange=TRUE) +
  geom_ribbon(aes(ymin = Low, ymax = High, fill = group), alpha = .25) +
  labs(fill = "Weight Class") +
  scale_fill_manual(values = c("red", "orange"), name = "fill")

...