javascript - d3 图表的工具提示无法正确解析 2009 年 2 月

标签 javascript d3.js

我有一个面积图可以正确解析工具提示的日期——除了 2009 年 2 月。

这是一个演示问题的 Plunker:http://plnkr.co/edit/Yl4hUDVin2sZedu016Wm?p=preview

我认为这是有问题的代码:

  var mousex = d3.mouse(this);
  mousex = mousex[0] ;//+ 3; //7
  var invertedx = xScale.invert(mousex);
  var invertedxmo = xScale.invert(mousex);
  var invertedxyr = xScale.invert(mousex);

  function getMonth(date) {
    var month = date.getMonth() + 1;
    return month < 10 ? '0' + month : '' + month; 
  }

  invertedx = ("" + (invertedx.getMonth() + 1)).slice(-2) + '/' + invertedx.getFullYear();
  var selected = (d.values);

  for (var k = 0; k < selected.length; k++) {
    dates[k] = selected[k].x
    dates[k] = ("" + (dates[k].getMonth() + 1)).slice(-2) + '/' + dates[k].getFullYear();
  } 
  invertedxmo = ("" + (invertedxmo.getMonth() + 1)).slice(-2) ;
  var selectedmo = (d.values);

  for (var m = 0; k < selectedmo.length; k++) {
    dates[m] = selectedmo[m].x
    dates[m] = ("" + (dates[m].getMonth() + 1)).slice(-2) ;
  }       
  invertedxyr = invertedxyr.getFullYear();

  mousedate = dates.indexOf(invertedx);
  pro = d.values[mousedate].y

  var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
  ];

我已经尝试更改 slice(-2),这解决了 2009 年 2 月的问题,但它也为解析每年的 12 月日期带来了新问题。

谁能演示如何解决这个问题?

编辑/更新: 有趣的是,当我通过将第 16 行从 var startDate = d3.time.month.offset(new Date(), -108); 更改为 var startDate = d3 来修改图表的日期范围时.time.month.offset(new Date(), -119);,然后 2009 年 2 月解析得很好 — 但 2008 年 2 月会抛出错误!同样,如果我通过将第 16 行的偏移值更改为 -98 来缩小日期范围:2010 年 2 月会引发错误,但所有后续的 2 月解析都很好,所有其他日期也是如此。 (显然,如果您改为使用 slider 来缩小日期范围,错误仍然只会发生在最初加载图表时显示的第一个 2 月,也就是移动 slider 之前。)

因此,无论日期范围是 2008 年、2009 年、2010 年等,似乎始终是图表上的第一个 2 月产生此错误。第一个之后的所有后续 2 月都是解析得很好。

最佳答案

鼠标悬停代码中的代码没有问题。问题出在 DATE

今天的日期是 30 号,您生成开始日期的方式是:

d3.time.month.offset(new Date(), -108);

即它以 Sun Nov 30 2008 16:46:58 GMT-0500 (EST) 开始,并按照以下方式进行:

Sun Nov 30 2008 16:52:32 GMT-0500 (EST)
Tue Dec 30 2008 16:52:32 GMT-0500 (EST)
Fri Jan 30 2009 16:52:32 GMT-0500 (EST)
Mon Mar 02 2009 16:52:32 GMT-0500 (EST)
Thu Apr 02 2009 16:52:32 GMT-0400 (EDT)
.....

由于找不到 2009 年 2 月的第 30 日,它最终选择了 2009 年 3 月 2 日,并且从那里开始,每个月的第 2 天都会被挑选出来,这肯定会包括所有的二月。 (在 createDatesArr 函数中)

一种方法是从每月的第一天开始。

相关代码:

var currentDate = new Date();
var firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
var startDate = d3.time.month.offset(firstDay, -108);

已更新 Plunkr

希望这对您有所帮助。 :)

关于javascript - d3 图表的工具提示无法正确解析 2009 年 2 月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47577822/

相关文章:

javascript - 检测点击是否在 OverlayView 内部

javascript - 如何检索和显示 slider 范围值?

javascript - onClick 文本字段显示 div?

javascript - dc.js 按月排序 X 轴

javascript - 使用 javascript 实现下拉菜单更改时的重绘功能

javascript - 如何在 d3 中换行以适合屏幕?

javascript - 使用 JQuery 通过 javascript 中的 1 个操作提交两个表单

javascript - 当字段中可能有逗号和引号时,从 CSV 转换为 JSON 的最佳方法是什么?

javascript - Skeleton Boilerplate - 带有 CSS 和 jQuery 的粘性 header 不起作用

d3.js 带负数的折线图