当映射到d3中的坐标比例时,如何计算闰年



当我将日期映射到x.domain()刻度时,我缺少闰年日期"02-29"。我试着用这种方法添加它:

x.domain(data.map(function(d) { return d.xPos, "02-29"; }));

但它只是将其添加到数组的末尾。另一种方法是重新排列CSV文件,并将闰年放在第一位。这是有效的,但看起来很粗糙。所以我想按如下方式添加它,但被卡住了:

    // define the x-scale 'manually' using a leap year
        var mindate = new Date(2016,0,1),
            maxdate = new Date(2016,11,31);
   // I then need to set the x.domain but the problem is I want it to be an Ordinal scale
       var x = d3.time.scale()
            .domain([mindate, maxdate]) 

当我正确设置x.domain()时,我就有了缩放非闰年的问题。如何为没有2月29日值的年份添加条件,以便为"02-29"x值提供对应的y值0?

你可以在这里看到我的blockbuilder,也可以在这里查看我的blo.ck。请注意右边2016年的02-29酒吧。。

尝试一种不同的方法,已经有一些函数可以帮助您获得闰年。例如:

function leapYear(year){ return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); }

然后获取返回的值,并使用if语句更改maxdate 的值

if (leapYear(maxdate[0]) && maxdate[1] == 2 && maxdate[2] == 28){ maxdate = new Date(year, 2 , 29) }else{ /* work as usual */ }

一种方法是确保x.domain()设置为一个数组,该数组包含典型闰年中每个日期的。即域应该是

["01-01", "01-02", ... , "02-28", "02-29", "03-01", ... "12-31"]

这意味着,每一个图表年份都将包括闰日——即使是非闰年,在这种情况下,闰日也将是无障碍的。我不确定这对你来说是否可以接受,但对我来说似乎合理

为了构建这种域,你需要在闰年的每一天(2016年和任何一天一样好)循环,并将其附加到数组中:

var leapYearDays = [];// will be populated with all dates
var currentDate = new Date(2016, 0, 1);// the date we'll be incrementing
var safety = 0;// helps prevent infinite looping during development
while(safety < 400 && currentDate.getFullYear() == 2016) {
  leapYearDays.push(formatMth(currentDate));
  currentDate.setDate(currentDate.getDate() + 1);
  safety++;
}
x.domain(leapYearDays);// apply as the x domain

此处更新了blockbuilder。

最新更新