Dygraphs:适用于 axisLabelFormatter 但不适用于 valueFormatter 的 JS 函数

Dygraphs: JS function working for axisLabelFormatter but not for valueFormatter

我正在开发一个 Shiny 应用程序,用于使用 Dygraphs 包可视化制造过程数据。我的数据如下所示(时间以秒为单位):

       Time                     Var1                    Var2
       0.05                0.2199809                180.2101
       0.10                0.2199809                180.1942
       0.15                0.2358754                180.1465
       0.20                0.2222697                180.1306       
       0.25                0.2222697                180.1306
       0.30                0.1768748                180.1465

首先,我将我的数据转换为 xts 格式(我乘以 1000,因为 Dygraphs 在绘图时会在同一秒内折叠观察结果,我无法解决这个问题):

  data_xts<-xts(data, as.POSIXct(1000*data[,"Time"], origin = "1970-01-01"))

这会产生一个像这样的 xts 对象:

                             Time                  Var1                    Var2
1970-01-01 00:00:50          0.05             0.2199809                180.2101
1970-01-01 00:01:40          0.10             0.2199809                180.1942
1970-01-01 00:02:30          0.15             0.2358754                180.1465
1970-01-01 00:03:20          0.20             0.2222697                180.1306
1970-01-01 00:04:10          0.25             0.2222697                180.1306
1970-01-01 00:05:00          0.30             0.1768748                180.1465

现在我想在几秒钟内获得一个带有 x 轴标签的 Dygraph 图(比如在时间变量中),并且还带有图例 x 值 - 鼠标悬停时出现的那些 - 以秒为单位。为此,我在我的 server.R 脚本中声明了一个 JS 函数来提取自时间原点以来经过的秒数:

  getsecs<- 'function(d) {
            var day=d.getDate();
            var hour=d.getHours();
            var minute=d.getMinutes();
            var second=d.getSeconds();
            var secs=84600*(day - 1)+3600*hour+60*minute +second;
            return 0.001*secs;}'

然后我在为 Shiny 输出构建 Dygraph 时使用这个函数:

 output$mygraph <- renderDygraph({
    VAR<-data_xts()[,c('Var1','Var2')]
    dygraph(VAR) %>%
    dySeries(colnames(VAR)[2], axis = 'y2') %>%
    dyAxis("x",axisLabelFormatter=JS(getsecs), valueFormatter=JS(getsecs)) %>%
    dyAxis("y", label = colnames(VAR)[1]) %>%
    dyAxis("y2", label = colnames(VAR)[2], independentTicks = TRUE) %>%
    dyOptions(drawGrid = input$showgrid) %>%             
    dyOptions(drawPoints = TRUE, pointSize = 2) %>%
    dyHighlight(highlightCircleSize = 3, highlightSeriesOpts = list(strokeWidth = 3)) %>%  
    dyLegend(width = 800) %>%
    dyRangeSelector()

})

这样做我得到了我想要的 x 轴标签,但鼠标悬停不起作用(该系列不突出显示,因此 x 图例为空白)。当我在控制台 (F12) 中搜索时出现此错误:

 d.getDate is not a function

错误似乎与getsecs函数输出的格式有关,但我不明白为什么它适用于labelFormatter但不适用于valueFormatter。

如有任何帮助,我们将不胜感激。提前致谢。

我也遇到了这个问题,现在终于弄明白了。

valueFormatter - returns valueOf 日期

axisLabelFormatter - returns 实际日期本身

因此,为了使它们相同,您必须针对 valueFormatter:

稍微修改您的函数
getsecs2 <- 'function(e) {
            var d = new Date(e);
            var day=d.getDate();
            var hour=d.getHours();
            var minute=d.getMinutes();
            var second=d.getSeconds();
            var secs=84600*(day - 1)+3600*hour+60*minute +second;
            return 0.001*secs;}'

并将 valueFormatter=JS(getsecs) 更改为 valueFormatter=JS(getsecs2)

您也可以只向 getsec 函数添加一个 if-else 语句,但我会把它留给您,因为我对 javascript.[=20= 还很陌生]