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= 还很陌生]
我正在开发一个 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= 还很陌生]