Моей первоначальной мыслью было также geom_polygon
, но на самом деле самый простой способ сделать это - использовать geom_ribbon
после изменения ваших данных.
Предположим, у вас есть что-то вроде этого:
library(tidyverse)
x1 <- seq(0, 2 * pi, 0.01)
x2 <- x1 + 0.005
y1 <- sin(x1)
y2 <- cos(x2)
df <- data.frame(x1, x2, y1, y2)
head(df)
#> x1 x2 y1 y2
#> 1 0.00 0.005 0.000000000 0.9999875
#> 2 0.01 0.015 0.009999833 0.9998875
#> 3 0.02 0.025 0.019998667 0.9996875
#> 4 0.03 0.035 0.029995500 0.9993876
#> 5 0.04 0.045 0.039989334 0.9989877
#> 6 0.05 0.055 0.049979169 0.9984879
Где у вас есть два набора значений x и два набора значений y. Вы можете просто преобразовать в длинный формат:
df2 <- pivot_longer(df, c("x1", "x2"))
head(df2)
#> # A tibble: 6 x 4
#> y1 y2 name value
#> <dbl> <dbl> <chr> <dbl>
#> 1 0 1.00 x1 0
#> 2 0 1.00 x2 0.005
#> 3 0.0100 1.00 x1 0.01
#> 4 0.0100 1.00 x2 0.015
#> 5 0.0200 1.00 x1 0.02
#> 6 0.0200 1.00 x2 0.025
, который затем позволяет использовать geom_ribbon
как обычно:
ggplot(df2, aes(x = value)) +
geom_ribbon(aes(ymax = y1, ymin = y2), alpha = 0.2, colour = "black")
Редактировать
Теперь, когда ОП связался с данными, проще увидеть, в чем проблема. Строки содержат 3 набора значений x / y, представляющих точки на минимальной линии, точки на максимальной линии и точки на средней линии. Однако три набора точек не сгруппированы по значению x и не упорядочены иначе. Поэтому они не «принадлежат» друг другу в строках и должны быть разделены на 3 группы, которые затем могут быть соединены слева в логические строки со значениями x, y, y_min и y_max:
library(tidyverse)
df_mid <- df %>% transmute(x = round(x1, 1), y = y1) %>% arrange(x)
df_upper <- df %>% transmute(x = round(x_upr, 1), y_upr = y_upr)
df_lower <- df %>% transmute(x = round(x_lwr, 1), y_lwr = y_lwr)
left_join(df_mid, df_lower, by = "x") %>%
left_join(df_upper, by = "x") %>%
filter(!duplicated(x) & !is.na(y_lwr) & !is.na(y_upr)) %>%
ggplot(aes(x, y)) +
geom_line() +
geom_ribbon(aes(ymax = y_lwr, ymin = y_upr), alpha = 0.2) +
theme_bw() +
theme(aspect.ratio = 1) +
scale_y_continuous(trans = 'log10') +
annotation_logticks(sides="l") +
scale_x_continuous(labels = function(x) paste0(x, "%")) +
ylab("log(y)") + xlab("x")