           d.y0 = y0
           d.value = y)
 
+    if params.simplify
+      simplify = _.partial simplifyPoints, params.simplify
+    else
+      simplify = _.identity
+
     if params.drawNullAsZero
       transform_value = (v) -> v ? 0
-      filter_scatter_values = _.identity
-      expand_line_values = _.identity
+      filter_scatter_values = simplify
+      expand_line_values = simplify
     else
       # TODO this won't work well with stack
       transform_value = (v) -> v
       filter_scatter_values = (values) ->
-        _.filter values, (d) -> d.value?
-      expand_line_values = expandIsolatedValuesToLineSegments
+        simplify _.filter values, (d) -> d.value?
+      expand_line_values = _.compose simplify, expandIsolatedValuesToLineSegments
 
     value_min = null
     value_max = null

          '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

        value_max = Math.max value, value_max
        {value, time: time, x: x(time), original: datapoint}
      bisector = d3.bisector (d) -> d.time
      lineMode =
        if params.areaMode is 'all' or params.areaMode is 'stacked'
          'area'
