如何在 R 中格式化 SPEI 包的硬编码绘图函数的 x 轴?
How to format the x-axis of the hard coded plotting function of SPEI package in R?
我正在使用 SPEI 包及其 32 年的月度样本数据。我想修改 x 轴标签以反映年份而不是数字。但是,硬编码绘图功能不允许我这样做。我厌倦了提取 SPEI$fitted
数据并尝试使用 ggplot 复制相同的图但没有成功。这是示例代码
install.packages("SPEI")
library(SPEI)
data("wichita")
wichita$PET=hargreaves(Tmin=wichita$TMIN, Tmax = wichita$TMAX, lat = 37.64)
wichita$BAL=wichita$PRCP - wichita$PET
SPEI_12=spei(wichita[,"BAL"],12)
plot.spei(SPEI_12, main = 12-Month SPEI)
如有任何帮助,我们将不胜感激。我想生成一个图表,如附件。
我不太了解plot.spei
这个功能,所以我用了ggplot2
。
基本上,我用 ts 的拟合值构建了一个数据框,并为正值 (pos
) 或负值 (neg
) 创建了 color/fill condition。
library(zoo)
library(tidyverse)
DF <- zoo::fortify.zoo(SPEI_12$fitted)
DF <- DF %>%
dplyr::select(-Index) %>%
dplyr::mutate(Period = zoo::as.yearmon(paste(wichita$YEAR, wichita$MONTH), "%Y %m")) %>%
na.omit() %>%
dplyr::mutate(sign = ifelse(ET0_har >= 0, "pos", "neg"))
ggplot2::ggplot(DF) +
geom_bar(aes(x = Period, y = ET0_har, col = sign, fill = sign),
show.legend = F, stat = "identity") +
scale_color_manual(values = c("pos" = "darkblue", "neg" = "red")) +
scale_fill_manual(values = c("pos" = "darkblue", "neg" = "red")) +
scale_y_continuous(limits = c(-3, 3),
breaks = -3:3) +
ylab("SPEI") + ggtitle("12-Month SPEI") +
theme_bw() + theme(plot.title = element_text(hjust = 0.5))
编辑:一个额外的想法。
DF2 <- DF %>%
tidyr::spread(sign, ET0_har) %>%
replace(is.na(.), 0)
ggplot2::ggplot(DF2) +
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(-3, 3),
breaks = -3:3) +
ylab("SPEI") + ggtitle("12-Month SPEI") +
theme_bw() + theme(plot.title = element_text(hjust = 0.5))
我正在使用 SPEI 包及其 32 年的月度样本数据。我想修改 x 轴标签以反映年份而不是数字。但是,硬编码绘图功能不允许我这样做。我厌倦了提取 SPEI$fitted
数据并尝试使用 ggplot 复制相同的图但没有成功。这是示例代码
install.packages("SPEI")
library(SPEI)
data("wichita")
wichita$PET=hargreaves(Tmin=wichita$TMIN, Tmax = wichita$TMAX, lat = 37.64)
wichita$BAL=wichita$PRCP - wichita$PET
SPEI_12=spei(wichita[,"BAL"],12)
plot.spei(SPEI_12, main = 12-Month SPEI)
如有任何帮助,我们将不胜感激。我想生成一个图表,如附件。
我不太了解plot.spei
这个功能,所以我用了ggplot2
。
基本上,我用 ts 的拟合值构建了一个数据框,并为正值 (pos
) 或负值 (neg
) 创建了 color/fill condition。
library(zoo)
library(tidyverse)
DF <- zoo::fortify.zoo(SPEI_12$fitted)
DF <- DF %>%
dplyr::select(-Index) %>%
dplyr::mutate(Period = zoo::as.yearmon(paste(wichita$YEAR, wichita$MONTH), "%Y %m")) %>%
na.omit() %>%
dplyr::mutate(sign = ifelse(ET0_har >= 0, "pos", "neg"))
ggplot2::ggplot(DF) +
geom_bar(aes(x = Period, y = ET0_har, col = sign, fill = sign),
show.legend = F, stat = "identity") +
scale_color_manual(values = c("pos" = "darkblue", "neg" = "red")) +
scale_fill_manual(values = c("pos" = "darkblue", "neg" = "red")) +
scale_y_continuous(limits = c(-3, 3),
breaks = -3:3) +
ylab("SPEI") + ggtitle("12-Month SPEI") +
theme_bw() + theme(plot.title = element_text(hjust = 0.5))
编辑:一个额外的想法。
DF2 <- DF %>%
tidyr::spread(sign, ET0_har) %>%
replace(is.na(.), 0)
ggplot2::ggplot(DF2) +
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(-3, 3),
breaks = -3:3) +
ylab("SPEI") + ggtitle("12-Month SPEI") +
theme_bw() + theme(plot.title = element_text(hjust = 0.5))