2

我正在使用 R 的 playwith 包以交互方式绘制大量时间序列数据。结果,我经常放大和缩小,以至于axis.POSIXct的单个“by”参数变得不切实际(即,有时我想查看整个数据范围,因此更喜欢by=" year”,而其他时候我会放大细节,然后 by="day" 会更有帮助)。

我设计了一种根据当前缩放级别调整“按”和“格式”的方法,但是我的解决方案仍然施加了“延迟”。这种延迟意味着:

  1. 我使用“导航”工具选择缩放区域
  2. 情节刷新,反映了我的“放大”动作,除了......
  3. xaxis 保持格式化,就好像使用前面的 'by' 和 'format' 参数
  4. 我现在再次使用“导航”工具来选择类似于当前绘图区域的缩放区域(即,我根本不放大)
  5. 绘图区域保持大致相同(如预期),但 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轴上......

干杯

4

0 回答 0