geom_vline не работает после scale_x_discrete в R

Я здесь новичок, извините, что не правильно написал вопрос:p

1, цель состоит в том, чтобы построить график среднего значения NDVI за период времени (8 дат были выбраны с 2019-05 по 2019-10 годы) моего исследовательского сайта (названного RB1). И нанесите вертикальные линии, чтобы показать дату с событием стрижки травы.

2. Теперь я рассчитал значение NDVI для этих 8 выбранных дат и создал файл CSV.(PS. "Вырубка" означает, что пастбище на исследуемом участке было вырублено, поэтому соответствующие даты должны быть показаны в виде вертикальной линии с использованием geom_vline)

infor <- read_csv("plotting information.csv")
infor
# A tibble: 142 x 3
   date         NDVI cutting
   <date>      <dbl> <lgl>  
 1 2019-05-12 NA     NA     
 2 2019-05-13 NA     NA     
 3 2019-05-14 NA     NA     
 4 2019-05-15 NA     NA     
 5 2019-05-16 NA     NA     
 6 2019-05-17  0.787 TRUE      
# ... with 132 more rows

3, проблема в том, что когда я делаю ggplot, сначала я хочу сохранить ось x как весь период времени (с 2019-05 по 2019-10), но, конечно, не показывать все даты между ними, иначе будет способ на оси абсцисс отображается слишком много дат). Итак, я делаюscale_x_discrte(breaks=, labels=) для отображения конкретных дат со значениями NDVI.

Во-вторых, я также хочу показать даты, когда были срезаны травы. geom_vline.

НО, это похоже на предварительное условие для scale_x_discrte должен factor моя дата, в то время как предварительное условие для geom_vline сохранить дату как nummeric. эти два призыва кажутся противоречащими друг другу.

y1 <- ggplot(infor, aes(factor(date), NDVI, group = 1)) +
  geom_point() +
  geom_line(data=infor[!is.na(infor$NDVI),]) + 
  scale_x_discrete(breaks = c("2019-05-17", "2019-06-18", "2019-06-26", "2019-06-28","2019-07-23","2019-07-28", "2019-08-27","2019-08-30", "2019-09-21"), 
                   labels = c("0517","0618","0626","0628","0723","0728", "0827","0830","0921"))) 


y2 <- ggplot(infor, aes(date, NDVI, group = 1)) +
  geom_point() +
  geom_line(data=infor[!is.na(infor$NDVI),])) 

когда я добавляю geom_vline в y1, на моем графике не отображаются вертикальные линии:y1 + geom_vline

когда я добавляю его в y2, вертикальные линии были показаны, но даты (ось x) странные (не отображаются как y1, потому что мы не запускаем здесь scale_x_) y2 + geom_vline

   y1 + 
      geom_vline(data=filter(infor,cutting == "TRUE"), aes(xintercept = as.numeric(date)), color = "red", linetype ="dashed")

Буду признателен, если вы можете помочь! заранее спасибо!:D

1 ответ

Я согласен с комментарием об оставлении дат как дат. В этом случае вы можете указать x-точку пересеченияgeom_vline как свидание.

Приведены основные данные:

df <- tribble(
  ~Date, ~Volume, ~Cut,
  '1-1-2010', 123456, 'FALSE',
  '5-1-2010', 789012, 'TRUE',
  '9-1-2010', 5858585, 'TRUE',
  '12-31-2010', 2543425, 'FALSE'
)

Я устанавливаю дату, а затем вытаскиваю подмножество для Cut=='TRUE' в новый объект:

df <- mutate(df, Date = lubridate::mdy(Date))

d2 <- filter(df, Cut == 'TRUE') %>% pull(Date)

И, наконец, используйте объект для указания перехватов:

df %>%
  ggplot(aes(x = Date, y = Volume)) +
  geom_vline(xintercept = d2) +
  geom_line()
Другие вопросы по тегам