Dygraph:JS函数适用于axisLabelFormatter,但不适用于valueFormatter

Dygraphs: JS function working for axisLabelFormatter but not for valueFormatter

本文关键字:适用于 不适用 valueFormatter axisLabelFormatter JS 函数 Dygraph      更新时间:2023-09-26

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

       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,因为Dygraph在绘图时将观测值折叠在同一秒内,我无法解决这个问题):

  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值(用鼠标悬停显示的值)。为此,我在服务器中声明了一个JS函数。提取自时间原点以来经过的秒数的R脚本:

  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-返回valueOf日期

axisLabelFormatter-返回实际日期本身

因此,为了使它们相同,您必须稍微修改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)

您也可以将if-else语句添加到getsec函数中,但我将把它留给您,因为我对javascript非常陌生。