我正在开发一个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/