         value_max = Math.max value, value_max
         {value, time: moment(timestamp * 1000), original: datapoint}
       bisector = d3.bisector (d) -> d.time
-      {values, bisector, name: s.target}
+      lineValues = expand_line_values values
+      scatterValues = filter_scatter_values values
+      lineMode =
+        if params.areaMode is 'all' or params.areaMode is 'stacked'
+          'area'
+        else if params.areaMode is 'first' and targetIndex is 0
+          'area'
+        else
+          'line'
+
+      lineFn = if lineMode is 'line'
+        line
+      else
+        area
+      targetColor = color targetIndex
+      {values, bisector, name: s.target, lineValues, scatterValues, lineMode, lineFn, color: targetColor}
 
     if params.areaMode is 'stacked'
       stack targets

        lineWidth = params.lineWidth

      path = target.append("path")
          .attr('class', line_mode)
          .attr('stroke', (d, i) -> color i)
          .style('stroke-width', lineWidth)
          .attr('fill', (d, i) -> if line_mode(d, i) is 'area' then color i)
          .attr('d', (d, i) -> line_fn(d, i)(expand_line_values(d.values)))
      if hover
        path
        .style('stroke-opacity', 0)

    externalBrushChanges.onValue ({extent}) ->
      if extent?
        domain = x.domain()
        brush.extent [Math.min(Math.max(domain[0], extent[0]), domain[1]), Math.max(Math.min(domain[1], extent[1]), domain[0])]
      else
        brush.clear()
