2016-01-13 3 views
4

Я ищу, чтобы создать многослойный линейный график, похожий на следующий пример:dc.js - значения отображения наведения мыши из диаграммы вне графика

https://dc-js.github.io/dc.js/

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

I.e. вместо того, чтобы задерживаться на секунду с помощью курсора на графике, а затем, при открытии окна мыши, я хотел бы, чтобы значения отображались за пределами графика, аналогично тому, как это делается в Google Finance (см., как цена и vol в левом верхнем углу графика изменяются по мере наведения мыши). Например. https://www.google.com/finance?q=apple&ei=MUiWVtnQIdaP0ASy-6Uo

Я бы очень признателен за любую информацию, которую сообщество могло бы поделиться с тем, что является лучшим способом приблизиться к этому.

ответ

5

Вы можете сделать это, добавив свои собственные события mouseover/mouseout к точкам на диаграмме. Я добавил .display-qux пядь внутри диаграммы DIV:

<div id="monthly-move-chart"> 
    ... 
    <span class="display-qux"></span> 
</div> 

но, конечно, это может быть где-то еще, это только делает его легко выбрать для этого примера.

Затем добавить события мыши с помощью renderlet событие, которое запускаемое после каждого рендеринга и каждый перерисовывать:

.on('renderlet', function(chart) { 
     chart.selectAll('circle.dot') 
      .on('mouseover.foo', function(d) { 
       chart.select('.display-qux').text(dateFormat(d.data.key) + ': ' + d.data.value); 
      }) 
      .on('mouseout.foo', function(d) { 
       chart.select('.display-qux').text(''); 
      }); 
    }); 

.foo является пространством имен событий, чтобы не мешать внутреннему использованию этих событий. Вероятно, вы должны использовать здесь слово, которое имеет отношение к тому, что вы пытаетесь сделать. Documentation on event namespaces is here.

Пример вывода:

external display of current point

Процесс одинаков для добавления событий в других графиках, но, к примеру, вы бы selectAll('rect.bar', ... для гистограмм и т.д.

+0

Спасибо большое Гордон! Именно то, что я искал! Я просто хотел уточнить, что вы подразумеваете под «The .foo - пространство имен событий, чтобы не мешать внутреннему использованию этих событий». Так что вы говорите - и, пожалуйста, поправьте меня, если у меня возникло это смешение, поскольку я новичок в этом, - это то, что по существу .foo - это произвольная метка, которую вы использовали, чтобы избежать возможности того, что класс «display» уже можно было принять ... т.е. просто произвольное слово, чтобы убедиться, что мы обращаемся к определенному элементу с присвоенным ему уникальным классом? это правильно? – TheBlake

+0

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

+0

Удивительный, спасибо за разъяснение! – TheBlake