2016-04-12 2 views
3

Когда я сопоставляю свои даты с моей шкалой x.domain(), мне не хватает даты високосного года «02-29». Я попытался добавить его, используя этот подход:Как мне отображать високосные годы при сопоставлении с исходной шкалой в d3?

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() правильно я тогда возникает проблема масштабирования, не високосные годы. Как добавить условное выражение в течение года без значения 29 февраля, так что для x-значения «02-29» задано соответствующее значение 0 для значения y?

Вы можете увидеть мой блокбастер here или мой blo.ck here. Обратите внимание на бродячий 02-29 бар в 2016 году справа.

+0

'29-Feb-88,0.4' также есть эта проблема? Я родился в тот день :) – sabithpocker

+1

С Днем запоздалого дня рождения в 2016 году, вы должны действительно освободиться, если вы можете праздновать только каждые 4 года! – eoin

ответ

0

Один из способов сделать это заключается в обеспечении 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 here.

+0

@eoin, я только что понял, что раньше у меня была неправильная ссылка. Теперь он обновлен и должен проиллюстрировать то, что я предложил выше. – meetamit

+0

Я понял, что и обновил его из вашего ответа выше, приветствия :). Мне все еще нужно как-то войти в нулевой заполнитель в 29 февраля за непиковые годы? Посмотрите, что произойдет с моей подсказкой в ​​этом обновленном блочном блоке [ссылка] (http://blockbuilder.org/eoiny/a034d4737c80c55a4cf5a69c7698b9a5). Я не могу пройти мимо 30 декабря. – eoin

+0

эй, глядя немного ближе к своему решению, кажется, что он отлично работает. Моя текущая проблема на самом деле проблема с тем, как я поймаю мое событие mousemove. Еще раз спасибо. – eoin

1

Попробуйте другой подход, там уже есть некоторые функции, которые помогут вам получить, какие годы високосные годы. Такие, как:

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

затем захватить возвращаемое значение и использовать, если заявление, чтобы изменить значение MaxDate

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

+0

спасибо за отзыв Я также проверю ваш подход, возможно, мне придется использовать его для второго шага в моей проблеме - см. Мой комментарий к @meetamit ниже. – eoin

+0

Я вижу, что вы имеете в виду под нулевым заполнителем? Чтобы исправить это, мы могли бы объединить оба ответа, увидеть ответ meetamit, и вы можете ввести его, а если функция leapYear() возвращает true, а не только 2016, то в этом сценарии вы можете добавить февраль - 29, когда оно будет истинным и работать нормально для non leapYears –

+0

Теперь длина x.domain() равна 366, для которой наборы данных в високовом году имеют много значений d.rain, тогда как непиковый год заканчивается «неопределенным» в позиции «02-29». Поэтому я думаю, что мне нужно нажать d.rain значение 0 в эту позицию для не-високосных лет, чтобы избежать «TypeError», который я получаю с помощью моей подсказки? См. Ссылку ниже. – eoin

Смежные вопросы