Проблема: я хочу раскрасить линии
Название трюка, я знаю. У меня есть три линии, которые выглядят так: Я хочу закрасить область между зеленым и красным. В основном, красная и зеленая линии представляют границы своего рода доверительного интервала для синей линии. Сейчас я могу закрасить только половину, и это потому, что синий цвет ниже зеленого до пересечения, а зеленый ниже синего после пересечения . Однако я не могу покрасить вторую половину, потому что синий и красный расходятся.
Есть ли простой способ закрасить две почти вертикальные линии, как этот?
Я пробовал geom_ribbon, но нигде не получил. Вот мой текущий код, окрашивающий только половину.
Минимальный рабочий пример
library(ggplot2)
# Lines to plot
blue_line <- function(x) 28.6*x - 51
red_line <- function(x) -16*x + 28
green_line <- function(x) 5.5*x-10
# Data to plot
x <- seq(from=1, to=4, length.out=200)
df <- data.frame(x=x, yblue=blue_line(x), yred=red_line(x), ygreen=green_line(x))
ggplot(data=df, aes(x=x)) +
geom_ribbon(aes(x=x, ymin=ygreen, ymax=yblue), fill="grey80") +
geom_line(aes(x=x, y=yblue), color="blue") +
geom_line(aes(x=x, y=yred), color="red") +
geom_line(aes(x=x, y=ygreen), color="green") +
coord_cartesian(xlim=c(-3.5, 8), ylim=c(-4, 12))
, который производит
Второй минимальный рабочий пример
Этот код работает, однако обратите внимание, насколько он утомителен, повторяется и просто глуп. Надеюсь, что есть гораздо лучший способ.
library(ggplot2)
# Lines to plot
blue_line <- function(x) 28.6*x - 51
red_line <- function(x) -16*x + 28
green_line <- function(x) 5.5*x-10
# Data to plot
x <- seq(from=0.9, to=4.2, length.out=200)
# Below
x_below <- seq(from=0.9, to=2.06, length.out=200)
y_below <- rep(-5, 200)
y_below_above <- c(green_line(x_below[x_below <= 1.76744]), red_line(x_below[x_below > 1.76744]))
# Above
x_above <- seq(from=-2.5625, to=4.181818, length.out=200)
y_above <- rep(13, 200)
y_above_below <- c(red_line(x_above[x_above<=1.76744]), green_line(x_above[x_above>1.76744]))
df <- data.frame(x=x, yblue=blue_line(x), yred=red_line(x), ygreen=green_line(x),
ybelow=y_below, xbelow=x_below, y_below_above=y_below_above,
xabove=x_above, yabove=y_above, y_above_below=y_above_below)
ggplot(data=df, aes(x=x)) +
geom_ribbon(aes(x=xbelow, ymin=ybelow, ymax=y_below_above), fill="grey80") +
geom_ribbon(aes(x=xabove, ymin=y_above_below, ymax=yabove), fill="grey80") +
geom_line(aes(x=x, y=yblue), color="blue") +
geom_line(aes(x=x, y=yred), color="red") +
geom_line(aes(x=x, y=ygreen), color="green") +
coord_cartesian(xlim=c(-3.5, 8), ylim=c(-4, 12))
с получением желаемого