Масштабируемая временная шкала с одним элементом на тик (D3V6)

#javascript #d3.js

Вопрос:

Я работаю над диаграммой на основе временной шкалы, которая всегда должна иметь одну прямую линию на тик по оси x. Идея состоит в том, чтобы использовать цвет каждого прямоугольника для передачи объема данных, содержащихся в этой дате (что-то вроде тепловой карты).

На диаграмме также есть сгруппированные значения y. То есть, есть две оси y: по одной для каждой группы, и внутри каждой из них три линии (подгруппы). Семантически намерение состоит в том, чтобы сказать: «Для этого купона на эту дату есть столько-то показаний для каждого типа данных«. Чтобы помочь прояснить мои дальнейшие намерения, в этой библиотеке есть очень похожее решение, к которому я стремлюсь.

Хорошо, и твой вопрос…?

Мой вопрос заключается в том, чтобы выровнять прямоугольники с галочками и сохранить их такими. Как я могу сделать так, чтобы они всегда совпадали с галочками? Есть ли способ «привязать» прямую кишку к клещу? Что еще хуже, график должен быть масштабируемым, поэтому при прокрутке и изменении размеров тиков прямоугольники должны придерживаться соответствующих тиков: двигаться вместе с ними, соответственно изменять их ширину и так далее. В принципе, я хотел бы «женить» прямые на их соответствующих галочках.

Что вы пробовали?

Мой подход прямо сейчас состоит в том, чтобы сделать ширину сегментов зависимой от текущего количества тиков и, по сути, рассматривать текущие тики так, как если бы они были моими данными. То есть:

 segmentWidth = state.width() / ticks.length;
 

И при обновлении/рендеринге прямых:

 state.mainG.selectAll('g.couponData')
    .selectAll('g.column')
    .data(ticks)
    ...
 

Одна из проблем, которую я вижу в этом, заключается в том, что при нажатии и перетаскивании галочки расширяются, поэтому использование единого глобального segmentWidth подхода кажется неправильным. Похоже, мне понадобится способ захватить каждый тик и определить расстояние до следующего, и использовать его в качестве ширины каждого соответствующего сегмента, но я еще не совсем добрался до этого.

Вот пример того, что у меня есть:https
://jsfiddle.net/bnekvp0o/11/

TBH, я предполагаю, что совершаю некоторые глупые ошибки в расчетах, но я также чувствую, что я грубо применяю решение, поэтому я не решаюсь продолжать пытаться заставить его работать с моим нынешним подходом, так как я совсем новичок в этой структуре.

Заранее спасибо!