On Tue, Jul 20, 2010 at 9:21 AM, Jeff Klukas <klu...@wisc.edu> wrote:

> Hello,
>
> The documentation for hist seems to indicate that you should be able
> to send a list of values through the 'weights' parameter in axes.hist,
> and this worked in previous versions.  In 1.0, however, this produces
> an error.  I've attached a diff (also pasted below) that I believe
> produces the expected behavior.
>
> It can be tested with:
> plt.hist([1,2,3], weights=[1,2,3])
>
> The above fails in the development version, but works with the diff.
> Could someone add this fix?
>
> Thanks,
> Jeff
>
> || Jeff Klukas, Research Assistant, Physics
> || University of Wisconsin -- Madison
> || jeff.klu...@gmail | jeffyklu...@aim | jeffklu...@skype
> || http://klukas.web.cern.ch/
>
>
> Index: lib/matplotlib/axes.py
> ===================================================================
> --- lib/matplotlib/axes.py      (revision 8565)
> +++ lib/matplotlib/axes.py      (working copy)
> @@ -7587,7 +7587,12 @@
>                 else:
>                     raise ValueError("weights must be 1D or 2D")
>             else:
> -                w = [np.array(wi) for wi in weights]
> +                try:
> +                    weights[0][0]
> +                except TypeError:
> +                    w = [np.array(weights)]
> +                else:
> +                    w = [np.array(wi) for wi in weights]
>
>             if len(w) != nx:
>                 raise ValueError('weights should have the same shape as x')
>
>
Good catch, Jeff.  Looking over the code, looks like both the input data, x,
and the weights get similar pre-processing done to ready it for
histogramming. It appears that a fix was made to how x was being processed,
but the same was not done to weights.  I have a patch that fixes the
pre-processing of weights, and also  adds comments to both blocks of code to
remind future developers to make sure changes are made to both chunks of
code.

The functional part of the change was to check if the first element of
weights was an iterable or not.  Before, the weights array as in the given
example would be considered 1-element weights for 3 datasets, rather than
3-element weights for 1 dataset.

Ben Root
Index: lib/matplotlib/axes.py
===================================================================
--- lib/matplotlib/axes.py	(revision 8574)
+++ lib/matplotlib/axes.py	(working copy)
@@ -7551,6 +7551,8 @@
                 'hist now uses the rwidth to give relative width '
                 'and not absolute width')
 
+        # Massage 'x' for processing.
+        # NOTE: Be sure any changes here is also done below to 'weights'
         if isinstance(x, np.ndarray) or not iterable(x[0]):
             # TODO: support masked arrays;
             x = np.asarray(x)
@@ -7577,8 +7579,9 @@
             if len(color) != nx:
                 raise ValueError("color kwarg must have one color per dataset")
 
+        # We need to do to 'weights' what was done to 'x'
         if weights is not None:
-            if isinstance(weights, np.ndarray):
+            if isinstance(weights, np.ndarray) or not iterable(weights[0]) :
                 w = np.array(weights)
                 if w.ndim == 2:
                     w = w.T
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to