我正在开发一个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轴标签(如在Time变量中)以及带有图例x值(随鼠标悬停而出现的x值)的Dygraph图。为此,我在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;}'


然后在构造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刚起步,因此我将其留给您。

关于javascript - 字体符号:JS函数适用于axisLabelFormatter,但不适用于valueFormatter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31000726/

10-12 13:59