Index: lib/matplotlib/legend.py
===================================================================
--- lib/matplotlib/legend.py	(revision 8655)
+++ lib/matplotlib/legend.py	(working copy)
@@ -253,6 +253,15 @@
 
         # introduce y-offset for handles of the scatter plot
         if scatteryoffsets is None:
+            if scatterpoints<2:
+                self._scatteryoffsets = np.array([.5])
+            elif scatterpoints==2:
+                self._scatteryoffsets = np.array([.5,.5])
+            elif scatterpoints==3:
+                self._scatteryoffsets = np.array([3./8., 4./8., 2.5/8.])
+            else:
+                self._scatteryoffsets = np.ones(scatterpoints)*(3./8.)
+                self._scatteryoffsets[1::2] = 4./8.
             self._scatteryoffsets = np.array([3./8., 4./8., 2.5/8.])
         else:
             self._scatteryoffsets = np.asarray(scatteryoffsets)
@@ -446,6 +455,7 @@
         """
 
         fontsize = self._fontsize
+        markerscale = self.markerscale
 
         # legend_box is a HPacker, horizontally packed with
         # columns. Each column is a VPacker, vertically packed with
@@ -554,14 +564,13 @@
 
             elif isinstance(handle, RegularPolyCollection):
 
-                #ydata = self._scatteryoffsets
                 ydata = height*self._scatteryoffsets
 
                 size_max, size_min = max(handle.get_sizes())*self.markerscale**2,\
                                      min(handle.get_sizes())*self.markerscale**2
                 if self.scatterpoints < 4:
-                    sizes = [.5*(size_max+size_min), size_max,
-                             size_min]
+                    sizes = np.array([.5*(size_max+size_min), size_max,
+                             size_min])
                 else:
                     sizes = (size_max-size_min)*np.linspace(0,1,self.scatterpoints)+size_min
 
@@ -585,12 +594,12 @@
                 size_max, size_min = max(handle.get_sizes())*self.markerscale**2,\
                                      min(handle.get_sizes())*self.markerscale**2
                 if self.scatterpoints < 4:
-                    sizes = [.5*(size_max+size_min), size_max,
-                             size_min]
+                    sizes = np.array([.5*(size_max+size_min), size_max,
+                             size_min])
                 else:
                     sizes = (size_max-size_min)*np.linspace(0,1,self.scatterpoints)+size_min
 
-                p = type(handle)(sizes,
+                p = type(handle)(sizes*markerscale,
                                  offsets=zip(xdata_marker,ydata),
                                  transOffset=self.get_transform(),
                                  )
Index: lib/matplotlib/axes.py
===================================================================
--- lib/matplotlib/axes.py	(revision 8655)
+++ lib/matplotlib/axes.py	(working copy)
@@ -7492,11 +7492,14 @@
               - 'barstacked' is a bar-type histogram where multiple
                 data are stacked on top of each other.
 
-              - 'step' generates a lineplot that is by default
-                unfilled.
+              - 'step' is a histogram outlined by a lineplot with unfilled
+                patches. Toutlines only follow the top of the histogram, and 
+                hence *rwidth* has no effect.
 
-              - 'stepfilled' generates a lineplot that is by default
-                filled.
+              - 'stepfilled' is a histogram bounded by a lineplot with filled
+                patches underneath. This is distinct from 'bar' in that the
+                outlines only follow the top of the histogram, and hence
+                *rwidth* has no effect.
 
           *align*: ['left' | 'mid' | 'right' ]
             Controls how the histogram is plotted.
@@ -7521,7 +7524,9 @@
             If *True*, the histogram axis will be set to a log scale.
             If *log* is *True* and *x* is a 1D array, empty bins will
             be filtered out and only the non-empty (*n*, *bins*,
-            *patches*) will be returned.
+            *patches*) will be returned.  If *histtype* is 'step' or
+            'stepfilled', this can also be a float>0 specifying the value to 
+            assign to empty bins.
 
           *color*:
             Color spec or sequence of color specs, one per
@@ -7720,9 +7725,14 @@
             y = np.zeros( 2*len(bins), np.float )
 
             x[0::2], x[1::2] = bins, bins
+            
+            if log is true:
+                minimum = 1.0
+            elif log:
+                minimum = float(log)
+            else:
+                minimum = 0.0
 
-            minimum = min(bins)
-
             if align == 'left' or align == 'center':
                 x -= 0.5*(bins[1]-bins[0])
             elif align == 'right':
