我有以下数据集(Bu.Dis):
row.names Date DIS
116 1Q1 0.1120
117 1Q2 0.1104
118 1Q3 0.3794
119 1Q4 0.3983
120 2Q1 0.3175
121 2Q2 0.2275
122 2Q3 0.2171
123 2Q4 0.1973
124 3Q1 0.2499
125 3Q2 0.1819
126 3Q3 0.2613
127 3Q4 0.2302
128 4Q1 0.3795
129 4Q2 0.2406
130 4Q3 0.2486
131 4Q4 0.2464
使用ggplot将其绘制为时间序列非常简单:
require(ggplot2)
Bu.Dis["Date"] <- NA
Bu.Dis$Date <- seq(as.Date("2001/1/1"), as.Date("2004/12/31"), by = "3 months")
ggplot(Bu.Dis, aes(Date, DIS))+geom_line()+
theme(legend.position = "none", panel.background = element_rect(fill = "#FFFFFF", colour="#000000"),
panel.grid.major = element_line(colour = "grey", linetype = "dotted"))
但是,当我尝试使用changepoint包时,我必须将数据帧转换为时间序列向量。
Bu.Dis.ts <- ts(Bush.Dis[,2], c(2001, 1), frequency = 4)
var.Bu.Dis=cpt.var(Bu.Dis.ts, method="PELT")
plot(var.Bu.Dis)
用“情节”绘制这个矢量也很容易,但我想用ggplot来做。问题是,var.Bu.Dis是一个S4对象。如何用ggplot绘制这个S4对象?
顺便说一句,是否有更简单的方法将“日期”中的条目转换为时间序列兼容的日期格式(最好是像2001-1或2001-Q1那样的四分之一格式)?
答案 0 :(得分:1)
我想我自己回答了这个问题(至少我遇到的大多数问题): ggplot无法绘制ts数据。所以你必须改变它。
ggplot(melt(data.frame(time=as.numeric(time(var.Bu.Dis@data.set)), var.Bu.Dis@data.set), id.vars="time"), aes(time, value)) +
geom_line() +
geom_vline(xintercept = cpts.ts(var.Bu.Dis), colour="red", linetype = "dotdash")
geom_vline用于绘制“变化点”。
但我仍然收到这条消息: “不知道如何自动选择ts类型对象的比例。默认为连续”
但仍有一个问题: 在x轴上,仅显示年份,但不显示季度。我怎么能改变它?
答案 1 :(得分:1)
我会查看ggfortify,它可以将ts对象解析为ggplot2: http://rpubs.com/sinhrks/plot_ts
ggfortify的另一个好处是它支持时间序列统计:http://rpubs.com/sinhrks/plot_tsstats
要将日期字段格式化为年份和季度,请尝试以下操作:
library(zoo)
yq <- as.yearqtr(Bu.Dis$Date, format = "%Y/%m/%d")
format(yq, format = "%Y-0%q")
结合起来,这应该可以满足您的需求。假设您每季度有多个观察值,您可能需要使用stat_summary()进行一些聚合。
干杯,
亚当