【问题标题】:NVD3 - line chart NaN on safari using latest versionsNVD3 - 使用最新版本的 safari 折线图 NaN
【发布时间】:2018-11-17 14:59:09
【问题描述】:

使用 NVD3 作为折线图,我的所有数据都被插入到一条垂直线中(而不是穿过水平线),当我悬停该线时,我得到 0NaN 重复。这只发生在 safari 中

这里是java:

function drawChart(div, att_speed, data) {
  nv.addGraph(function() {
    var chart = nv.models.lineChart()
    .interpolate("cardinal")
    .forceY([0,att_speed])
    ;
    // Convert the date passed as a STRING into a DATE object
    chart.x(function(d) { 
      return new Date(d.x); 
    });
    chart.xAxis.axisLabel('Time (m)');
    chart.xAxis.tickFormat(function(d) {
      return d3.time.format('%H:%M')(new Date(d));
    });
    chart.yAxis
      .axisLabel("Speed (mb)") //Set Y-Axis attributes.
      .tickFormat(d3.format(".0f")) //Set Y-Axis label formatting.
    ;
    d3.select("#" + div + " svg") //Select the document's <svg> element
      .datum(data) 
      .transition().duration(500).call(chart); //Define transition and pass the d3.selection to our lineChart.

    nv.utils.windowResize(chart.update);

    return chart; 
  });        
}
datalink_one = [
        {
            values: [{"x": "2018-06-19 14:21:22", "y": "80"}, {"x": "2018-06-19 14:24:02", "y": "89"}, {"x": "2018-06-19 14:25:10", "y": "127"}, {"x": "2018-06-19 14:28:04", "y": "91"}, {"x": "2018-06-19 14:30:11", "y": "92"}, {"x": "2018-06-19 14:31:21", "y": "80"}, {"x": "2018-06-19 14:34:03", "y": "131"}, {"x": "2018-06-19 14:35:28", "y": "98"}, {"x": "2018-06-19 14:37:11", "y": "86"}, {"x": "2018-06-19 14:39:02", "y": "111"}, {"x": "2018-06-19 14:42:03", "y": "95"}, {"x": "2018-06-19 14:43:04", "y": "165"}, {"x": "2018-06-19 14:45:11", "y": "89"}, {"x": "2018-06-19 14:47:11", "y": "133"}, {"x": "2018-06-19 14:49:16", "y": "134"}, {"x": "2018-06-19 14:52:05", "y": "157"}, {"x": "2018-06-19 14:54:13", "y": "66"}, {"x": "2018-06-19 14:55:09", "y": "95"}, {"x": "2018-06-19 14:58:02", "y": "112"}, {"x": "2018-06-19 14:59:09", "y": "98"}],
            key: "Download",
            color: "#337ab7",
            area: true   
        },
        {
            values: [{"x": "2018-06-19 14:21:22", "y": "17"}, {"x": "2018-06-19 14:24:02", "y": "49"}, {"x": "2018-06-19 14:25:10", "y": "44"}, {"x": "2018-06-19 14:28:04", "y": "57"}, {"x": "2018-06-19 14:30:11", "y": "18"}, {"x": "2018-06-19 14:31:21", "y": "14"}, {"x": "2018-06-19 14:34:03", "y": "20"}, {"x": "2018-06-19 14:35:28", "y": "24"}, {"x": "2018-06-19 14:37:11", "y": "19"}, {"x": "2018-06-19 14:39:02", "y": "29"}, {"x": "2018-06-19 14:42:03", "y": "12"}, {"x": "2018-06-19 14:43:04", "y": "13"}, {"x": "2018-06-19 14:45:11", "y": "22"}, {"x": "2018-06-19 14:47:11", "y": "14"}, {"x": "2018-06-19 14:49:16", "y": "29"}, {"x": "2018-06-19 14:52:05", "y": "14"}, {"x": "2018-06-19 14:54:13", "y": "11"}, {"x": "2018-06-19 14:55:09", "y": "29"}, {"x": "2018-06-19 14:58:02", "y": "15"}, {"x": "2018-06-19 14:59:09", "y": "25"}],
            key: "Upload",
            color: "#5cb85c",
            area: true   
        }
    ]
drawChart('one-speed-chart', 500.0, datalink_one)

这是一个小提琴(在 safari 中会失败)

https://jsfiddle.net/xpvt214o/279009/

这是截图

【问题讨论】:

  • 您可以将您的代码添加到Fiddle,以便有人帮助您。
  • 嗨,我添加了一个小提琴,不幸的是,我什至无法再获得 NanNan,我不确定我做了什么,但 nvd3 目前没有渲染
  • 在小提琴的左侧菜单中有一个“资源”部分,您可以在其中添加您正在使用的库的CDN。确保使用您正在使用的相同库版本、D3、NVD3 和 CSS 对其进行更新
  • 我想我已经做到了,谢谢
  • @shabeer90 有什么想法吗?

标签: jquery d3.js nvd3.js


【解决方案1】:

终于找到答案了,对于safari来说,你的json里的日期时间格式需要如下

%Y-%m-%dT%H:%M:%S

我发现的这个问题引导我找到答案Safari Javascript Date() NaN Issue (yyyy-MM-dd HH:mm:ss)

【讨论】:

    【解决方案2】:

    我在使用您的代码时注意到的一些事情。

    key: 'Upload' 的部分数据集中,您在单引号内获得了'x' 的值,最好在数据集中保持一致。我通常不使用x 的单引号。

    您得到 0NaN 的原因是因为您将日期作为 STRING 而不是 DATE 对象传递。

    这是我添加到您的代码中的内容:

    var chart = nv.models.lineChart(); //Create instance of nvd3 lineChart  
    
    // Convert the date passed as a STRING into a DATE object
    chart.x(function(d) {     
      return new Date(d.x);
    });
    

    这是您的代码here 的工作版本。

    我建议在 X 轴中格式化您的日期,以避免它们相互重叠。你可以找到更多关于时间的信息formatting using d3.js here


    更新工作版本与您的代码here

    要修复 Safari 浏览器上的 NaN 问题,您可以相应地格式化时间

      chart.xAxis.tickFormat(function(d) {
        return d3.time.format('%Y-%m-%dT%H:%M:%S')(new Date(d));
      });
    

    希望对你有帮助

    【讨论】:

    • 我将您的代码几乎完全相同地复制到我的代码中,由于某种原因,我只是变得空白,在调试中我收到错误“字符串与预期的模式不匹配”​​第 4312 行在 d3.js .我更新了问题以显示我的代码
    • @AlexW 您在数据集中的X 值必须是完整的日期时间戳,以便可以在chart.x() 函数中将其转换为日期对象。然后在tickFormat() 函数中,您可以选择您希望它在图表中呈现的方式。
    • @AlexW 你有两个选择。 1) 将其保留为 x: '2018-06-07 14:59:11' 或 2) 将日期作为 unix 时间戳 x: '1528383551' 传递。现在我建议使用选项 1。您是否设法查看了我在回答中分享的演示?
    • 是的,我已经针对您的演示进行了复制,但仍然收到错误 SyntaxError:字符串与预期模式不匹配。我也根据选项 1 更改了日期格式
    • 你能用你的最新代码和确切的错误代码更新你的问题吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多