我正在使用 R 的 playwith 包以交互方式绘制大量时间序列数据。结果,我经常放大和缩小,以至于axis.POSIXct的单个“by”参数变得不切实际(即,有时我想查看整个数据范围,因此更喜欢by=" year”,而其他时候我会放大细节,然后 by="day" 会更有帮助)。
我设计了一种根据当前缩放级别调整“按”和“格式”的方法,但是我的解决方案仍然施加了“延迟”。这种延迟意味着:
- 我使用“导航”工具选择缩放区域
- 情节刷新,反映了我的“放大”动作,除了......
- xaxis 保持格式化,就好像使用前面的 'by' 和 'format' 参数
- 我现在再次使用“导航”工具来选择类似于当前绘图区域的缩放区域(即,我根本不放大)
- 绘图区域保持大致相同(如预期),但 xaxis 采用我在 3 中预期的格式。(这是“延迟”)
您可以使用以下代码检查自己:
library(xts)
library(playwith)
xts1 <- xts(rnorm(200, 0), seq(as.POSIXct(0, origin="1970-01-01"), as.POSIXct(100000000, origin="1970-01-01"), length=200))
xts2 <- xts(rnorm(200, 0), seq(as.POSIXct(0, origin="1970-01-01"), as.POSIXct(100000000, origin="1970-01-01"), length=200))
XRANGE <- diff(range(as.numeric(index(xts1))))/3600/24/365
# plot with playwith
playwith(
{
plot(xts1, xlab="",xaxt="n",ylab="", main="'Zoomable' xlim", ylim=range(c(xts1, xts2)), xlim=range(index(xts1)), type="n", cex.lab=0.7, cex.axis=0.7)
# choose the appropriate xaxis "by" parameter
axis.POSIXct(1, at=seq(range(index(xts1))[1], range(index(xts1))[2], by=BY), format=FORMAT, las=2, cex.axis=0.7)
# plot data
lines(xts1, col="red")
lines(xts2, col="blue")
},
update.actions=function(playState)
{
.GlobalEnv$XRANGE <- diff(as.numeric(rawXLim(playState)))/3600/24/365;
# evaluate the "by" and "format" parameters for the xaxis
.GlobalEnv$BY <- ifelse(XRANGE >= 2.5, "year", ifelse(XRANGE >= 0.15 & XRANGE < 2.5, "month", "day"));
.GlobalEnv$FORMAT <- ifelse(XRANGE >= 2.5, "%Y", ifelse(XRANGE >= 0.15 & XRANGE < 2.5, "%Y-%m", "%Y-%m-%d"));
print(diff(as.numeric(rawXLim(playState)))/3600/24/365);
print(BY)
},
time.mode=T)
谁能帮我这个?鉴于我对使用 playwith 包的了解非常肤浅,如果我只是以错误的顺序使用事物,而不是在相关变量被用于情节之前更新它们,我不会感到惊讶。然而,我已经用尽了我的能力来摆弄这些我几乎不理解的非常“理论”的游戏结构。
PS,该脚本包含 2 行打印行,它们将向您显示 'by' 参数在超过阈值时确实会发生变化;它只是不知何故没有反映在情节的x轴上......
干杯