研发ggplot:绘制不规则时间序列

发布于 2024-09-11 16:04:11 字数 546 浏览 4 评论 0原文

我有事件发生后几天的数据。这些数据是不定期采样的 - 我的时间点是 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 轴上的刻度是非常不准确的日期时间。我可以重新格式化它们吗?但无论如何都看不到将格式设置为“从开始起的天数”。到目前为止,我已经在谷歌上搜索了很长一段时间,总有一种挥之不去的感觉,我错过了一些非常明显的东西。我是吗?

I have data at a number of days since an event. This data is sampled irregularly - my time points are like 0, 5, 6, 10, 104 days. I don't have specific date-time information - i.e. I have no idea when in real life the event I'm studying occurred.

I'd like to plot, using ggplot, my time series. I can use, say

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

but of course my x-axis variables are plotted next to each other, so that the distance between t=10 and t=104 is the same as t=5 and t=6. So I can make something up like

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

which almost works, but now the ticks on my x-axis are horribly inaccurate date times. I could re-format them maybe? But can't see anyway to make the format "days from start". And by now I've been googling around for quite a while, with the nagging feeling that I'm missing something seriously obvious. Am I?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寻找一个思念的角度 2024-09-18 16:04:11

不确定这是否是您要找的(请参阅 此相关问题)。您可以使用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")
}

Not sure if this is what you're looking for (see this related question). You can reformat the axis and deal with irregularity by using the scale_x functions. For instance:

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")))

Incidentally, here's a function that I created for plotting multivariate zoo objects:

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")
}
人│生佛魔见 2024-09-18 16:04:11

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

ggplot 非常擅长为正确类型的数据使用正确的比例。 (遗憾的是,R 中的数据导入例程通常不太智能......)

Sounds like your time variable is a factor or maybe a character vector, not a numeric value! If you do data$time <- as.numeric(data$time) it may well solve your problem.

ggplot is pretty good at using the right sort of scale for the right sort of data. (Sadly, data import routines in R generally are less smart...)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文