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()