График с заштрихованной областью, занятой несколькими строками

#r #ggplot2 #plot #graph

#r #ggplot2 #график #График

Вопрос:

ПОСТАНОВКА ЗАДАЧИ

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

ПРИМЕР КОДА

 library(tidyverse)
library(ggplot2)

set.seed(1)

# Produce a similar table to the real one
example <- tibble(values = seq(0, 10, 0.1),
                  sine1  = sin(values   0.2),
                  sine2  = sin(values - 0.2),
                  sine3  = sin(values   0.4)   0.2,
                  sine4  = sin(values - 0.4) - 0.2,
                  sine5  = sin(values - 0.4)   0.2,
                  sine6  = sin(values - 0.2)   0.4) %>%
            pivot_longer(-values) # final format with 3 columns

# Create a line graph, where each line represents a different sine curve
graph1 <- ggplot(example, aes(x = values, y = value, col = name))  
          geom_line(size = 3, show.legend = FALSE, alpha = 0.5)  
          theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
                panel.background = element_blank(), axis.line = element_line(colour = "black"))
graph1
  

ВОПРОС

Есть ли способ перейти от этого графика…

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

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

к этому (или подобному)? Примечание: толстая черная линия не является строго необходимой введите описание изображения здесь

Ответ №1:

Вам просто нужно сгруппировать в отдельную единицу времени и вычислить минимальные / максимальные значения. Это позволяет построить geom_ribbon :

 example %>% 
  group_by(values) %>% 
  summarize(min = min(value), max = max(value)) %>%
  ggplot()  
  geom_ribbon(aes(x = values, ymin = min, ymax = max), size = 2,
              fill = "#29c8e5", color = "black")  
  theme_classic()
  

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

Если вы предпочитаете, чтобы лента перекрывала ваш исходный график, вы могли бы сделать:

 ribbon <- example %>% 
  group_by(values) %>% 
  summarize(min = min(value), max = max(value))

graph1  
  geom_ribbon(aes(x = values, ymin = min, ymax = max), 
              data = ribbon, size = 0, fill = "#29c8e5", 
              color = NA, alpha = 0.3, inherit.aes = FALSE)
  

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

Как бы то ни было, я думаю, что первый вариант более визуально эффектен.

Комментарии:

1. Именно то, что я искал.! Большое вам спасибо. Я согласен, что первый вариант более яркий и более четко передает мое сообщение.