如何在ggplot2图中突出显示时间序列项

时间:2014-09-22 16:27:56

标签: r plot ggplot2 time-series

我希望通过独特的颜色或形状突出显示时间序列中特定值之上或之下的片段。在示例数据中,我将死亡时间序列分解为其组件。我的目标是在趋势分量的死亡率低于35(1997年至2000年之间的深度)和残余成分高于100(峰值)时强调细分。我曾试图使用注释,但这并没有产生我想要的东西。

#Load library and obtain data

library(gamair) 
library(tsModel)
library(ggplot2)
library(reshape2)
data<-data(chicago)

## create variables, decompose TS
chicago$date<-seq(from=as.Date("1987-01-01"), to=as.Date("2000-12-31"),length=5114)
data<- chicago[,c("date","death")]
mort <- tsdecomp(data$death, c(1, 2, 15, 5114))

## Convert matrix to df, rename, melt
df<-as.data.frame(mort)
names(df)[1] <- "Trend"
names(df)[2] <- "Seasonal"
names(df)[3] <- "Residual"
df$date<-seq(as.Date("1987-01-01"), as.Date("2000-12-31"), "day")
meltdf <- melt(df,id="date")

##  Plot 

ggplot(meltdf,aes(x=date,y=value,colour=variable,group=variable)) + geom_line() +
theme_bw() +
ylab("") + xlab("") + 
facet_grid(variable ~ . , scales = "free") +
theme(legend.position = "none") 
annotate("rect", xmin=1995-01-01,xmax=1996-01-01,ymin= 10, ymax=300, alpha = .2,fill="blue")

enter image description here

1 个答案:

答案 0 :(得分:3)

嗯,这是有效的,但我必须承认,这是我希望的更多工作。

get.box <- function(data) {
  rng <- range(data$date) + c(-50,50)
  z   <- meltdf[meltdf$date>=rng[1] & meltdf$date <=rng[2] & meltdf$variable==unique(data$variable),]
  data.frame(variable=unique(z$variable),
             xmin=min(z$date),xmax=max(z$date),ymin=min(z$value),ymax=max(z$value))
}
hilight.trend <- get.box(with(meltdf,meltdf[variable=="Trend" & value<35,]))
hilight.resid <- get.box(with(meltdf,meltdf[variable=="Residual" & value>100,]))
ggplot(meltdf,aes(colour=variable,group=variable)) + 
  geom_line(aes(x=date,y=value)) +
  theme_bw() +
  ylab("") + xlab("") + 
  facet_grid(variable ~ . , scales = "free") +
  theme(legend.position = "none") +
  geom_rect(data=hilight.trend, alpha=0.2, fill="red",
            aes(xmax=xmax,xmin=xmin,ymax=ymax,ymin=ymin)) +
  geom_rect(data=hilight.resid, alpha=0.2, fill="blue", 
            aes(xmax=xmax,xmin=xmin,ymax=ymax,ymin=ymin))

您无法将annotate(...)与facet结合使用,因为您将在所有方面获得相同的注释。所以你留下了像geom_rect(...)这样的东西。这里的问题是geom_rect(...)为数据中的每一行绘制一个矩形 。因此,您需要创建一个辅助数据集,每个variable只包含一行,包含x-和y- min和max。