Затенение различных областей графика в зависимости от периода времени

#r #ggplot2

#r #ggplot2

Вопрос:

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

 paleo.dates <- c(c(13500,8000), c(13500,10050) ,c(10050,9015), 
c(9015,8000), c(8000,2500), c(8000,5500), c(5500,3500), c(3500,2500), 
c(2500,1150), c(2500,2000), c(2000,1500), c(1500,1150), c(1150,500))
  

Я хотел бы взять период времени, скажем, от 13500 до 8000, и закодировать его цветом, пока он не перекрывается с другой датой, например, третьей записью.

Я использую ggplot2 cheatsheat, и я пытался использовать aes(fill = paleo.dates) , но это не работает, поскольку это не та же длина, что и мой набор данных. Я также думал об использовании geom_rect() для ручного заполнения областей, но это кажется не очень элегантным, и я не уверен, что это вообще сработает.

Любые советы приветствуются, спасибо.

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

1. Что вы имеете в виду «пока оно не перекрывается с другой датой»? Разве вторая запись также не перекрывается с первой? Что происходит при этих перекрытиях? Должно быть легко изменить оттенок в зависимости от того, где дата попадает в набор взаимоисключающих диапазонов.

2. Да, даты в начале повсюду, я думал о том, чтобы сделать какой-то градиентный цвет для представления перекрытий, но не уверен, как это сделать. Как бы я изменил оттенок во взаимоисключающем диапазоне? использование geom_rect() не очень удовлетворяет, поэтому, если есть умный способ, который был бы аккуратным.

3. Создайте столбец, который определяет диапазон для каждой строки (например, используя case_when ), и заполните на основе этого столбца

Ответ №1:

Вам просто нужно создать подмножество периода. В этом случае я создал sub вектор для преобразования в фактор для облегчения заливки.

 library(dplyr)
library(ggplot2)

df <- data.frame(paleo.dates = seq(500, 13000, 100),
                 p = runif(n = length(seq(500, 13000, 100)),
                           0, 1))

sub <- data.frame(sub = rep(1:(13000/500), each = 5))
sub <- sub %>%
  dplyr::slice(1:nrow(df))
df <- df %>% 
  dplyr::mutate(period = sub$sub,
                period = as.factor(period))
ggplot2::ggplot(df)  
  geom_bar(aes(x = paleo.dates, y = p, 
               fill = period,
               col = period), 
           show.legend = F, stat = "identity")  
  theme_bw()
  

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