R 使用ggplot显示SPEI:当标志改变时,geom_区域在不同位置结束/开始

R 使用ggplot显示SPEI:当标志改变时,geom_区域在不同位置结束/开始,r,ggplot2,geom-area,R,Ggplot2,Geom Area,这里有一些数据 structure(list(Period = structure(c(2017.83333333333, 2017.91666666667, 2018, 2018.08333333333, 2018.16666666667, 2018.25, 2018.33333333333, 2018.41666666667, 2018.5, 2018.58333333333, 2018.66666666667, 2018.75, 2018.83333333333, 2018.9166

这里有一些数据

structure(list(Period = structure(c(2017.83333333333, 2017.91666666667, 
2018, 2018.08333333333, 2018.16666666667, 2018.25, 2018.33333333333, 
2018.41666666667, 2018.5, 2018.58333333333, 2018.66666666667, 
2018.75, 2018.83333333333, 2018.91666666667, 2019, 2019.08333333333, 
2019.16666666667, 2019.25, 2019.33333333333, 2019.41666666667, 
2019.5), class = "yearmon"), neg = c(0, 0, 0, 0, 0, 0, 0, 0, 
-0.782066446199374, -1.33087717414387, -1.55401649141939, -1.9056578851487, 
-2.19869230289699, -1.99579537718088, -2.03857957860623, -2.14184701726747, 
-2.27461866979037, -2.39022691659445, -2.3732334198156, -1.83686080707261, 
-1.86553025598681), pos = c(0.550567625206492, 0.699954781241267, 
0.775518140437689, 0.647367030217637, 0.84562688020279, 0.923814518387379, 
0.686796306801202, 0.131849327496122, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0)), row.names = 960:980, class = "data.frame")
我想用ggplot绘制SPEI值,正如我在这里学到的:

结果如下所示:


如您所见,当符号从正变为负时,geom_区域不会在同一位置结束/开始。有人知道怎么解决这个问题吗?我想用
Date
代替
yearmon
,但遇到了同样的问题。

这是一个门和柱的问题:拐点处的每个几何图形区域都在一个柱上开始和结束,因此重叠。他们应该从门柱中间的门开始。 这个解决方案可能有点笨手笨脚,但我认为它应该适用于从积极到消极的多重变化,反之亦然


图书馆(GG2)
图书馆(tidyr)
图书馆(tibble)
图书馆(dplyr)
图书馆(lubridate)
图书馆(imputeTS)
确定数据何时从正变为负或从负变为正

  inflections <- 
    test %>% 
    mutate(inflect = case_when(lag(neg) == 0 & pos == 0 ~ TRUE,
                                  lag(pos) == 0 & neg == 0 ~ TRUE,
                                  TRUE ~ FALSE),
           rowid = row_number() - 0.5) %>%
    filter(inflect) %>% 
    select(-inflect) %>% 
    mutate(Period = NA_Date_,
           pos = 0, 
           neg = 0)

使用来自
imputeTS
的函数,输入数据从
pos
变为
neg
的时间

test1$Period <- na_interpolation(as.ts(test1$Period))


数据
```

测试这可能是由于您的
期间
,因为它不是正确的年-月格式。这是一个月数据吗?是的,格式是
yearmon
来自
zoo
@BappaDas我认为这不是那么容易,
as.Date
不起作用:
as.Date(格式(期间,%Y-%m-01”)
生成相同的图
test1 <- 
  test %>% 
  rowid_to_column() %>%
  bind_rows(inflections) %>% 
  arrange(rowid)

test1$Period <- na_interpolation(as.ts(test1$Period))

    ggplot(test1) + 
      geom_area(aes(x = Period, y = pos), fill = "blue", col = "black") +
      geom_area(aes(x = Period, y = neg), fill = "red",  col = "black") +
      scale_y_continuous(limits = c(-2.25, 2.25), 
                         breaks = -2:2) +
      ylab("SPEI") + xlab("") +
      theme_bw()