首页 > 解决方案 > 如何使用 ggplot2 的 facet_wrap 创建时间序列图

问题描述

这是关于如何在 R 中格式化 SPEI 包的硬编码绘图函数的 x 轴的后续问题?. 在我之前的问题中,我有一个需要绘制的位置数据集,但是,在我目前的情况下,我有多个位置的数据集(总共 11 个)需要绘制在一个图中。我试图通过微调复制相同的代码,但是,代码没有产生正确的情节。我也没有看到 x 轴上的日期中断。任何帮助,将不胜感激。

library(SPEI)
library(tidyverse)
library(zoo)

data("balance")
SPEI_12=spei(balance,12)
SpeiData=SPEI_12$fitted

myDate=as.data.frame(seq(as.Date("1901-01-01"), to=as.Date("2008-12-31"),by="months"))
names(myDate)= "Dates"
myDate$year=as.numeric(format(myDate$Dates, "%Y"))
myDate$month=as.numeric(format(myDate$Dates, "%m"))
myDate=myDate[,-1]
newDates = as.character(paste(month.abb[myDate$month], myDate$year, sep = "_" )) 

DataWithDate = data.frame(newDates,SpeiData) 
df_spei12 = melt(DataWithDate, id.vars = "newDates" )
SPEI12 = df_spei12 %>% 
  na.omit() %>% 
  mutate(sign = ifelse(value >= 0, "pos", "neg")) 
SPEI12 = SPEI12%>% 
  spread(sign,value) %>% 
  replace(is.na(.), 0)

ggplot(SPEI12) + 
  geom_area(aes(x = newDates, y = pos), col = "blue") +
  geom_area(aes(x = newDates, y = neg),  col = "red") +
  facet_wrap(~variable)+
  scale_y_continuous(limits = c(-2.5, 2.5), breaks = -2.5:2.5) +
  scale_x_discrete(breaks=c(1901,1925,1950,1975,2000,2008))+
  ylab("SPEI") + ggtitle("12-Month SPEI") +
  theme_bw() + theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))+
  theme(axis.text = element_text(size=12, colour = "black"), axis.title = element_text(size = 12,face = "bold"))

这是代码生成的内容-它生成的不是面积图,而是条形图。 在此处输入图像描述

标签: rggplot2plottimeserieschartgeom-area

解决方案


您使用scale_x_discrete()但您在 x 轴上的变量newDates, 似乎是一个字符。它可以解释为什么在 x 轴上什么都没有打印。

如果您将 newDates 转换为数字(如您在评论中提出的那样)

SPEI12$newDates= as.numeric(as.character(gsub(".*_","",SPEI12$newDates)))

并使用scale_x_continuous()而不是离散的,你得到这个:

在此处输入图像描述


推荐阅读