Accepted answer

An updated jsfiddle is available here. Besides the line chart part, I did the following steps:

Create a scales object to get one scale per chart:

var scales = {};
  var currentData  = test.filter(function(d){return;})[0].data;
  scales[f]= d3.scale.linear()
               .domain([0, d3.max(currentData, function(d) {return d.value})])
               .range([lineHeight, 0])

Add a mousemove to the dispatch:

var dispatch = d3.dispatch('hideTooltip', 'iTooltip', 'mousemove');

Append a text to each chart to display the tooltip:

        .classed('tooltip', true)
        .style('text-anchor', 'end')
        .style('fill', function(d){return colorScale(});

Append a rect on each chart to subscribe to the mousemove event.

When the mouse moves, I get its position, compute the corresponding date, and dispatch it:

        .attr('x', 0)
        .attr('y', 0)
        .attr('width', xScale.range()[1])
        .attr('height', lineHeight)
        .style('pointer-events', 'all')
        .style('fill', 'transparent')
        .on('mousemove', function(d,i){
            var mouse=d3.mouse(this);
            var date = xScale.invert(mouse[0]);

Append a line over all 3 charts:'#chart-container')
      .classed('tooltip', 'true')
      .style('stroke', 'darkgray')

React to the dispatch mousemove event

I created a bisector to find the index of the closest date in the array of data for the chart. Thanks the date and, the bisector, the line can be moved appropriately, and the value of the tooltip can be displayed

var bisector = d3.bisector(function(d){return}).right;
dispatch.on('mousemove', function(date){'line.tooltip')
    .attr('transform', 'translate('+xScale(date)+',0)')'text.tooltip')
        .attr('transform', function(d,i){
          var value = bisector(, date);
          return 'translate('+xScale(date)+','+scales[]([value].value)+')';
          var value = bisector(, date);
          return d3.format('2.2f')([value].value);

Related Query