R + ggplot:绘制不规则时间序列

11

我有一些与事件发生后的天数相关的数据。这些数据是不规则采样的 - 我的时间点像0、5、6、10、104天。我没有具体的日期时间信息 - 也就是说,我不知道我正在研究的事件在现实生活中何时发生。

我想使用ggplot绘制我的时间序列图。我可以使用,比如说:

p <- ggplot(data,aes(x=time,y=expression))
p <- p + geom_point()

当然,我的x轴变量是相互挨着绘制的,所以t=10和t=104之间的距离与t=5和t=6之间的距离相同。因此,我可以自己编造一些东西。

start <- ISOdate(2001, 1, 1, tz = "")
data$time <- start + data$time*60*60*12

现在我的x轴上的刻度是非常不准确的日期时间,我可以重新格式化它们吗?但是我看不到任何使格式为“从开始算起的天数”的方法。我已经在Google上搜索了相当长时间,但总觉得我可能错过了什么非常明显的东西。我错了吗?

2个回答

9

不确定这是否是您正在寻找的内容(请参见此相关问题)。您可以使用scale_x函数重新格式化轴并处理不规则性。例如:

p <- qplot(1:3, 1:3, geom='line') 
p + scale_x_continuous("", breaks=1:3, 
        labels = as.Date(c("2010-06-03", "2010-06-04", "2010-06-07")))

顺便说一下,这是我为绘制多元zoo对象创建的函数:

qplot.zoo <- function(x) {
  if(!inherits(x, "zoo")) stop("x must be a zoo object")
  x.df <- data.frame(dates=index(x), coredata(x))
  x.df <- melt(x.df, id="dates", variable="value")
  ggplot(x.df, aes(x=dates, y=value, group=value, colour=value)) + geom_line() + opts(legend.position = "none")
}

谢谢!尽管最后证明是我自己的愚蠢导致了问题。什么是动物园对象? - Mike Dewar
@Mike:zoo 可能是 R 中最流行的不规则时间序列类:http://cran.r-project.org/web/packages/zoo/index.html - Shane
太棒了。我还没有接触过R的时间序列类。目前我正在处理基因表达时间序列,最多可能有6或7个时间点!目前还不需要专门的类(除了Bioconductor的ExpressionSets)! - Mike Dewar
感谢分享qplot.zoo! - derelict
fortify.zoo 函数的 zoo 对象帮助页面也有许多绘制 zoo 对象的示例。 - mrub

4

看起来你的time变量是一个因子或者可能是一个字符向量,而不是一个数值!如果你执行data$time <- as.numeric(data$time),它很可能会解决你的问题。

ggplot在使用正确类型的数据时表现得非常好。 (不幸的是,在R中通常导入数据的程序没有那么智能...)


1
应该使用 as.numeric(as.character(data$time)) 或者 as.numeric(levels(data$time)[data$time])。帮助页面显示第二种方法效率略高。 - JoFrhwld
如果它是一个因子,则正确。如果它已经是一个字符向量,可以给出类似的结果,则不需要进行内部转换。 - Harlan
1
糟糕。你是对的!这是一个该死的因素!我花了太长时间学习 as.numeric(levels(data$time)[data$time]) 这个惯用语(并在 Twitter 上抱怨),但完全忘记将其应用于我的数据。谢谢 Harlan! - Mike Dewar
我曾经遇到过类似的问题,将时间转换为数字后,绘图显示的是415这样的数字,而不是6:45或其他时间。有没有办法让坐标轴将值重新转换回时间/日期? - Jared
@MikeDewar:options(stringsAsFactors=FALSE)让我少了很多咒骂。我也在我的代码中加入了它,例如 read.csv(... , stringsAsFactors=FALSE),以确保不会出错。 - Jason
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接