如何使用ggplot2的facet_wrap创建timeseries绘图

如何使用ggplot2的facet_wrap创建timeseries绘图,r,ggplot2,plot,timeserieschart,geom-area,R,Ggplot2,Plot,Timeserieschart,Geom Area,这是一个关于的后续问题。在我的上一个问题中,我有一个需要绘制的单位置数据集,但是,在我目前的情况下,我有多个位置(总共11个)的数据集,需要在一个图形中绘制。我尝试复制相同的代码,只做了少量调整,但是,代码没有生成正确的绘图。此外,我没有看到日期在x轴上中断。任何帮助都将不胜感激 library(SPEI) library(tidyverse) library(zoo) data("balance") SPEI_12=spei(balance,12) SpeiData=SPEI_12$fitt

这是一个关于的后续问题。在我的上一个问题中,我有一个需要绘制的单位置数据集,但是,在我目前的情况下,我有多个位置(总共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"))
下面是代码生成的内容—它生成的不是面积图,而是条形图。

您使用的是
scale\u x\u discrete()
,但x轴上的变量
newDates
似乎是一个字符。这可以解释为什么x轴上什么都不打印

如果将新日期转换为数字(如您在注释中所建议的)

SPEI12$newDates=as.numeric(as.character(gsub(“.*”,“”,SPEI12$newDates)))

使用
scale\u x\u continuous()
而不是discrete,可以得到以下结果:


您使用的是
scale\u x\u discrete()
,但x轴上的变量
newDates
似乎是一个字符。这可以解释为什么x轴上什么都不打印

如果将新日期转换为数字(如您在注释中所建议的)

SPEI12$newDates=as.numeric(as.character(gsub(“.*”,“”,SPEI12$newDates)))

使用
scale\u x\u continuous()
而不是discrete,可以得到以下结果:


对于
geom\u区域
我在填充图时返回了一个错误(叠加),因此我使用了
geom\u条

library(SPEI)
library(tidyverse)
library(zoo)
library(reshape2)
library(scales)

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_md <- SPEI12 %>% 
  dplyr::mutate(Date = lubridate::parse_date_time(newDates, "m_y"),
                Date = lubridate::ymd(Date),
                variable = as.factor(variable))
levels(SPEI12_md$variable) <- c("Indore", "Kimberley", "Albuquerque", "Valencia",
                                "Viena", " Abashiri", "Tampa", "São Paulo", 
                                "Lahore", "Punta Arenas", "Helsinki")

v <- 0.1 # 0.1 it is a gap
v1 <- min(SPEI12_md$value) - v
v2 <- max(SPEI12_md$value) + v

vv <- signif(max(abs(v1), abs(v2)), 2)

ggplot2::ggplot(SPEI12_md) + 
  geom_bar(aes(x = Date, y = value, 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")) +
  facet_wrap(~variable) +
  scale_x_date(date_breaks = "10 years",
               labels = scales::date_format("%Y-%m")) + # 
  scale_y_continuous(limits = c(-vv, vv), breaks = c(seq(-vv-v, 0, length.out = 3),
                                                     seq(0, vv+v,  length.out = 3))) +
  ylab("SPEI") + ggtitle("12-Month SPEI") +
  theme_bw() + theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
                     axis.text = element_text(size=12, colour = "black"),
                     axis.title = element_text(size = 12,face = "bold"),
                     axis.text.x = element_text(angle = 90, size = 10))
库(SPEI)
图书馆(tidyverse)
图书馆(动物园)
图书馆(E2)
图书馆(比例尺)
数据(“余额”)
SPEI_12=SPEI(余额,12)
SpeiData=SPEI_12$已安装
myDate=as.data.frame(seq(as.Date(“1901-01-01”),to=as.Date(“2008-12-31”),by=“months”))
姓名(myDate)=“日期”
myDate$year=as.numeric(格式为myDate$Dates,“%Y”))
myDate$month=as.numeric(格式为myDate$Dates,“%m”))
myDate=myDate[,-1]
newDates=as.character(粘贴(month.abb[myDate$month],myDate$year,sep=“”))
DataWithDate=data.frame(newDates,SpeiData)
df_spei12=melt(DataWithDate,id.vars=“newDates”)
SPEI12=df_SPEI12%>%
na.省略()%>%
变异(符号=ifelse(值>=0,“pos”,“neg”))
###
SPEI12_md%
dplyr::mutate(Date=lubridate::parse_Date_time(newDates,“m_y”),
日期=润滑脂::ymd(日期),
变量=as.factor(变量))

水平(SPEI12_md$变量)与
geom_区域
我在填充图时返回一个错误(叠加),因此我使用
geom_条

library(SPEI)
library(tidyverse)
library(zoo)
library(reshape2)
library(scales)

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_md <- SPEI12 %>% 
  dplyr::mutate(Date = lubridate::parse_date_time(newDates, "m_y"),
                Date = lubridate::ymd(Date),
                variable = as.factor(variable))
levels(SPEI12_md$variable) <- c("Indore", "Kimberley", "Albuquerque", "Valencia",
                                "Viena", " Abashiri", "Tampa", "São Paulo", 
                                "Lahore", "Punta Arenas", "Helsinki")

v <- 0.1 # 0.1 it is a gap
v1 <- min(SPEI12_md$value) - v
v2 <- max(SPEI12_md$value) + v

vv <- signif(max(abs(v1), abs(v2)), 2)

ggplot2::ggplot(SPEI12_md) + 
  geom_bar(aes(x = Date, y = value, 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")) +
  facet_wrap(~variable) +
  scale_x_date(date_breaks = "10 years",
               labels = scales::date_format("%Y-%m")) + # 
  scale_y_continuous(limits = c(-vv, vv), breaks = c(seq(-vv-v, 0, length.out = 3),
                                                     seq(0, vv+v,  length.out = 3))) +
  ylab("SPEI") + ggtitle("12-Month SPEI") +
  theme_bw() + theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
                     axis.text = element_text(size=12, colour = "black"),
                     axis.title = element_text(size = 12,face = "bold"),
                     axis.text.x = element_text(angle = 90, size = 10))
库(SPEI)
图书馆(tidyverse)
图书馆(动物园)
图书馆(E2)
图书馆(比例尺)
数据(“余额”)
SPEI_12=SPEI(余额,12)
SpeiData=SPEI_12$已安装
myDate=as.data.frame(seq(as.Date(“1901-01-01”),to=as.Date(“2008-12-31”),by=“months”))
姓名(myDate)=“日期”
myDate$year=as.numeric(格式为myDate$Dates,“%Y”))
myDate$month=as.numeric(格式为myDate$Dates,“%m”))
myDate=myDate[,-1]
newDates=as.character(粘贴(month.abb[myDate$month],myDate$year,sep=“”))
DataWithDate=data.frame(newDates,SpeiData)
df_spei12=melt(DataWithDate,id.vars=“newDates”)
SPEI12=df_SPEI12%>%
na.省略()%>%
变异(符号=ifelse(值>=0,“pos”,“neg”))
###
SPEI12_md%
dplyr::mutate(Date=lubridate::parse_Date_time(newDates,“m_y”),
日期=润滑脂::ymd(日期),
变量=as.factor(变量))


级别(SPEI12_md$variable)只是为了清楚-我希望日期显示在图的最后一行方法如下?嘿@bbiasi我想联系你,但不知道如何标记你。是的,像那样,但是平均线上下的区域以不同的颜色闭合。你也回答了我前面的问题-谢谢。我已经提供了这个问题的链接。这是相似的,但有多个位置我把一个答案放在一起,我希望它足够好。如果你想联系我,我已经在我的个人资料中提供了一些信息。这项工作是关于什么?谢谢你-我试图复制我们的一个流域相同的工作,以在多个时间尺度assss盆地水分条件。好!如果
geom_area
不起作用,我想我必须将其他绘图(在前面的问题中)更改为
geom_bar
。只是想澄清一下-我希望日期显示在图形的最后一行,方法如下?嘿@bbiasi我想联系你,但不知道如何标记你。是的,像那样,但是平均线上下的区域以不同的颜色闭合。你也回答了我前面的问题-谢谢。我已经提供了这个问题的链接。这是相似的,但有多个位置我把一个答案放在一起,我希望它足够好。如果你想联系我,我已经在我的个人资料中提供了一些信息。这项工作是关于什么?谢谢你-我试图复制我们的一个流域相同的工作,以在多个时间尺度assss盆地水分条件。好!如果
geom_area
不工作,我想我必须将其他绘图(在前面的问题中)更改为
geom_bar
。部分原因是我将日期转换为字符,因为在重新排列(df_spei12)数据集时,它会给我带来重复错误。我猜
as.numeric(as.character(x))
在这里不起作用。如果日期是我代码中的字符,您将如何打印日期。我将日期格式更改为数字,但仍然没有x轴
SPEI12$newDates=as.numeric(as.character(gsub(“.*”,“”,SPEI12$newDates))
)。主要的问题是geom_区域,它产生的是条线而不是区域覆盖。@demarsylvain你知道为什么有些区域是阴影吗?我的情况与此类似,但使用
geom_bar
不会发生这种情况。这是因为同一个x轴点有多个点。获得分数(
group_by(newDates,variable)%%>%summary_at(vars(neg,pos),funs(sum))
)将解决问题。请毫不犹豫地投票选出有用的答案,并在答案无效时验证答案