【问题标题】:How to create multi-panels plots with scatterplot/xyplot and POSIX time objects?如何使用散点图/xyplot 和 POSIX 时间对象创建多面板图?
【发布时间】:2026-01-06 01:05:02
【问题描述】:

一个新手问题。 (添加新信息)

我有一组随机收集的时间戳数据。我喜欢创建图表矩阵,但我无法使用散点图或 xyplot 和时间对象创建。

我的数据

dataset$Time  #POSIX time objects (no set sampling period)
              #i built POSIX time objects by dataset$Time<-strptime(tt, "%H:%M:%OS")
              #the origial string was formated like this 12:12:12.234 (HH:MM:SS:msec)
dataset$d1, dataset$d2 #integers
dataset$d3 #factor with 10 levels

.

我能做到这些

plot( dataset$Time, dataset$d1)
scatterplot(dataset$d1 ~ dataset$d2 | dataset$d3, data=dataset)
xyplot(dataset$d1 ~ dataset$d2 | dataset$d3, data=dataset)

但是,我不能这样做(x 轴上的 POSIX 时间对象)

scatterplot(dataset$d1 ~ dataset$Time | dataset$d3, data=dataset)
xyplot(dataset$d1 ~ dataset$Time | dataset$d3, data=dataset)

新信息

结构错误(.Internal(as.POSIXct(x, tz)), class= c("POSIXt", "POSIXct"), : 'x' 参数无效。

(NEW INFO) 但这有效(y 轴上的 POSIX 时间对象)

xyplot(dataset$Time ~ dataset$d1 | dataset$d3, data=dataset)

相关但不同的问题是 hexbin。将时间对象添加到 hexbin 时,来自 hexbin 的绘图不会在单位上显示正确的时间格式。

bin<-hexbin(dataset$Time, dataset$d1) 
plot(bin))

我该怎么办?

感谢您的调查!

【问题讨论】:

    标签: datetime r datetime-format posixct


    【解决方案1】:

    这是一个工作示例。您可能弄错了数据格式——需要注意精确的数据格式。

    首先,一个简单的数据框:

    R> X <- data.frame(pt=Sys.Date()+0:4, x1=100+cumsum(rnorm(5)),
    +                                     x2=90+cumsum(rt(5,4)))
    R> X
              pt     x1    x2
    1 2010-06-22  98.73 90.33
    2 2010-06-23  99.43 89.56
    3 2010-06-24  98.85 86.95
    4 2010-06-25  99.08 88.52
    5 2010-06-26 100.30 94.08
    R> 
    

    这是lattice 不使用的所谓wide 形式。您需要将其转换为 long 格式。我在这里使用stack(),你也可以使用reshape中的cast()melt() 包装:

    R> Y <- data.frame(pt=rep(X$pt,2), stack(X, select=c(x1,x2)))
    R> Y
               pt values ind
    1  2010-06-22  98.73  x1
    2  2010-06-23  99.43  x1
    3  2010-06-24  98.85  x1
    4  2010-06-25  99.08  x1
    5  2010-06-26 100.30  x1
    6  2010-06-22  90.33  x2
    7  2010-06-23  89.56  x2
    8  2010-06-24  86.95  x2
    9  2010-06-25  88.52  x2
    10 2010-06-26  94.08  x2
    R> 
    

    现在xyplot 调用很简单:

    R> xyplot(values ~ pt | ind, data=Y, panel=panel.lines)
    

    您当然可以使用更复杂的条件表达式。

    【讨论】:

    • 嗨,德克! myabe,这是因为本地化的差异,但我的时间对象显示为“2010-06-21 17:45:42” x1、x2 和 ind 是什么?谢谢!
    • 当场创建了示例数据,这就是您获得不同时间值的原因。这两列是来自正态分布和 t 分布的随机数的累积和。
    • 问题不是数据格式,而是时间格式。似乎 R 在 POSIXct 与 POSIXlt 方面存在一些问题。谢谢!
    • 这是一个常见问题解答。你想要POSIXct(== 一个双精度)而不是POSIXlt(== 九个元素的列表)在你的data.frame 中——所以在列上调用as.POSIXct()
    • hexbinplot() 给我 POSIXct 错误“'/.difftime'(diff(ybonds), diff(.ylim) 中的错误:/ 的第二个参数不能是“difftime”对象”- --- scatterplot() 给我“'+.Date'(x[floor(d)], x[ceiling(d)]) 中的错误:二进制 + 没有为 Date 对象定义 --- 表示时间的任何建议以我不会收到这些错误的格式?谢谢!
    【解决方案2】:

    显然,R 在处理 POSIX 时代的成瘾问题时遇到了一些问题……它给了我错误:

    +.POSIXt(x[floor(d)], x[ceiling(d)]) 中的错误:未为“POSIXt”对象定义二进制“+”

    只需将它们转换为数字就可以了。您可以隐藏相应的轴,稍后用正确的日期重新绘制它

    例如:

    scatterplot(dataset$d1 ~ as.numeric(dataset$Time) | dataset$d3, data=dataset, xaxt="n")
    axis(1, at=as.numeric(dataset$Time), labels=dataset$Time, cex.axis=0.5)
    

    【讨论】:

    • 嗨,尼科! as.numeric() 和 as.POSIXct() 让我可以使用 xyplot,但不能使用 scatterplot()。您是否尝试过使用汽车包装中的 scatterplot()?
    • 用时间戳表示时间的任何替代方法?
    • 是的,我已经尝试过使用散点图,就像我在回答中写的示例一样……您创建/导入数据的方式可能有错误?你能提供一个数据样本吗?
    【解决方案3】:

    对我来说它只是工作,所以你可能有一个错误格式的时间向量。当您拨打class(dataset$Time) 时,您会得到什么?它应该包含“POSIXct”才能正常工作。

    另一方面,如果您提供data=dataset,则无需将dataset$ 放入公式中。

    【讨论】:

    • mbq,你是对的。在下面 nico 的帮助下,我能够通过 as.numeric() 或 as.POSIXct() 进行强制转换来使用 xyplot。然而,到目前为止,散点图是行不通的。谢谢!!