Я новичок в R и попытался заштриховать область, ограниченную некоторыми линейными функциями. Для своих функций я написал следующий код:

library(ggplot2)
library(dplyr)


x <- seq(0,30,1)
y1 <- (60-2*x)/0.8
y2 <- (90-4*x)/0.4
y3 <- (150-6*x)/0.8
df <- tbl_df(data.frame(x,y1,y2,y3))

df %>%
  ggplot(aes(x=x,y=y1))+
  geom_line(y=y1,color="red")+
  geom_line(y=y2,color="blue")+
  geom_line(y=y3,color="green")+
  ylim(0,225)

Который прекрасно рисует мне то, что я хочу. Я просто хочу иметь оранжевую область, как я нарисовал на картинке: эскиз

Координаты пересечения функций: x = (0,15,22.5,30) и y (225,75,18.75,0), если это помогает.

0
chritter1310 18 Янв 2021 в 17:17

2 ответа

Лучший ответ

Вы можете использовать для этого geom_ribbon. Вам нужно создать новый столбец в вашем фрейме данных со значениями y нижней границы области и сопоставить его с эстетикой ymin. Поскольку в этом случае у вас нет верхней границы, вы можете просто передать Inf в ymax.

Обратите внимание, что это может оставить некоторые пробелы над точками пересечения, если они явно не включены в фрейм данных (это случилось со мной в вашем примере). Чтобы исправить это, вы можете просто добавить значения x точек пересечения в x или уменьшить размер шага в x, чтобы вы были достаточно близко к точкам пересечения (это то, что я сделал).

# make size of step in x vector smaller
x <- seq(0,30,0.1)
y1 <- (60-2*x)/0.8
y2 <- (90-4*x)/0.4
y3 <- (150-6*x)/0.8
df <- tbl_df(data.frame(x,y1,y2,y3)) %>%
  # pmax computes the max value of y1, y2, y3 element-wise
  mutate(ymin=pmax(y1,y2,y3))

df %>%
  ggplot(aes(x=x,y=y1))+
  geom_line(y=y1,color="red")+
  geom_line(y=y2,color="blue")+
  geom_line(y=y3,color="green")+
  geom_ribbon(aes(x=x, ymin=ymin, ymax=Inf), fill='orange', alpha=0.5) +
  ylim(0,225)

enter image description here

2
kikoralston 18 Янв 2021 в 15:03

Основываясь на ответе kikoralston: чтобы получить полосы (если это важно для вас), вы можете использовать пакет ggpattern.

# load packages
library(tidyverse)
library(ggpattern)

# make size of step in x vector smaller
x <- seq(0,30,0.1)
y1 <- (60-2*x)/0.8
y2 <- (90-4*x)/0.4
y3 <- (150-6*x)/0.8
df <- tbl_df(data.frame(x,y1,y2,y3)) %>%
  # pmax computes the max value of y1, y2, y3 element-wise
  mutate(ymin=pmax(y1,y2,y3))

df %>%
  ggplot(aes(x=x,y=y1))+
  geom_line(y=y1,color="red")+
  geom_line(y=y2,color="blue")+
  geom_line(y=y3,color="green")+
  geom_ribbon_pattern(aes(x=x, ymin=ymin, ymax=Inf), 
                      pattern_color = NA,
                      pattern_fill = "orange",
                      pattern = "stripe", 
                      fill = NA, 
                      alpha=0.5) +
  ylim(0,225)

Что дает вам:

hashed area

1
Dan Adams 18 Янв 2021 в 17:55