     isCategorical = mapInstance.getValueType() == 'categorical'
 
     if isCategorical
-      renderCategoricalLegend(scope, valFn, mapInstance)
+      genericLegendRender(scope, $.proxy(filterDataForCategoricalLegend, this, mapInstance, valFn),
+      (d) ->
+        d.value
+      , (d) ->
+        d.key
+      )
     else
-      renderNumericalLegend(scope, valFn, mapInstance)
-
-
-  renderNumericalLegend = (scope, valFn, mapInstance) ->
-    data = valFn.range()
-
+      genericLegendRender(scope, valFn.range, (d) ->
+        extent = valFn.invertExtent(d)
+        "#{Math.round(10*extent[0])/10} – #{Math.round(10*extent[1])/10}"
+      , (d) ->
+        d
+      )
+
+
+  genericLegendRender = (scope, dataFn, textFn, classFn) ->
     scope.legend.selectAll('li.key')
-        .data(data)
+        .data(dataFn())
       .enter().append('li')
         .attr('class', 'key')
-        .text( (d, index) ->
-          extent = valFn.invertExtent(d)
-          "#{Math.round(10*extent[0])/10} – #{Math.round(10*extent[1])/10}"
-        )
+        .text( (d) -> textFn(d) )
       .append('svg')
         .attr('height', 30)
       .append('rect')

      ngProgress.complete()
    , 1000


  return {
    restrict: 'EA'

      renderLegend(scope, valFn)



  #    #############################################
  #      Legend Rendering
  #    #############################################

  renderLegend = (scope, valFn) ->
    # reset current legend
    scope.legend.selectAll('li.key')
