|
From: Andres L. <and...@ut...> - 2009-04-29 11:40:40
|
Hello, I try to do fill_between two arrays, that have missing value (masked arrays). Following code shows behaviour that seems not correct. Images what I expect the result to be (by omitting the missing value) and what I get by plotting the whole arrays. import pylab import numpy as np edatmax=np.array([10,4,6,9,np.nan,9,10]) edatmax=np.ma.masked_array(edatmax,np.isnan(edatmax)) edatmin=np.array([8,4,5,1,np.nan,8,5]) edatmin=np.ma.masked_array(edatmin,np.isnan(edatmin)) xtelg=np.arange(edatmax.size) xtelg=np.ma.masked_array(xtelg,np.isnan(edatmin)) pylab.plot(edatmax,"gx") pylab.plot(edatmin,"r+") # comment out to see better pylab.fill_between(xtelg,edatmax,edatmin,facecolor='green',alpha='0.3') # comment in to see better #pylab.fill_between(xtelg[:4],edatmax[:4],edatmin[:4],facecolor='green',alpha='0.3') #pylab.fill_between(xtelg[5:],edatmax[5:],edatmin[5:],facecolor='green',alpha='0.3') pylab.show() Version of matplotlib is current cvs. Best regards, Andres |
|
From: John H. <jd...@gm...> - 2009-04-29 15:54:07
|
On Wed, Apr 29, 2009 at 6:40 AM, Andres Luhamaa <and...@ut...>wrote: > Hello, > I try to do fill_between two arrays, that have missing value (masked > arrays). Following code shows behaviour that seems not correct. Images what > I expect the result to be (by omitting the missing value) and what I get by > plotting the whole arrays. > > import pylab > import numpy as np > edatmax=np.array([10,4,6,9,np.nan,9,10]) > edatmax=np.ma.masked_array(edatmax,np.isnan(edatmax)) > edatmin=np.array([8,4,5,1,np.nan,8,5]) > edatmin=np.ma.masked_array(edatmin,np.isnan(edatmin)) > xtelg=np.arange(edatmax.size) > xtelg=np.ma.masked_array(xtelg,np.isnan(edatmin)) > pylab.plot(edatmax,"gx") > pylab.plot(edatmin,"r+") > # comment out to see better > pylab.fill_between(xtelg,edatmax,edatmin,facecolor='green',alpha='0.3') > # comment in to see better > > #pylab.fill_between(xtelg[:4],edatmax[:4],edatmin[:4],facecolor='green',alpha='0.3') > > #pylab.fill_between(xtelg[5:],edatmax[5:],edatmin[5:],facecolor='green',alpha='0.3') > pylab.show() > > Version of matplotlib is current cvs. > fill_between does not currently support masked arrays, but I think we could easily extend it to support the mask using the existing support for the "where" kwarg. For now, does this behave like you expect? valid = ~(edatmax.mask & edatmax.mask ) pylab.fill_between(xtelg,edatmax,edatmin,facecolor='green',alpha='0.3', where=valid) JDH |
|
From: John H. <jd...@gm...> - 2009-04-29 15:54:51
|
On Wed, Apr 29, 2009 at 10:54 AM, John Hunter <jd...@gm...> wrote: > > > fill_between does not currently support masked arrays, but I think we could > easily extend it to support the mask using the existing support for the > "where" kwarg. For now, does this behave like you expect? > > valid = ~(edatmax.mask & edatmax.mask ) > pylab.fill_between(xtelg,edatmax,edatmin,facecolor='green',alpha='0.3', > where=valid) > > Oops -- meant valid = ~(edatmin.mask & edatmax.mask ) JDH |
|
From: Andres L. <and...@ut...> - 2009-04-30 15:19:53
|
John, that's exactly what I wanted, thanks. Andres John Hunter wrote: > > > On Wed, Apr 29, 2009 at 10:54 AM, John Hunter <jd...@gm... > <mailto:jd...@gm...>> wrote: > > > > fill_between does not currently support masked arrays, but I think > we could easily extend it to support the mask using the existing > support for the "where" kwarg. For now, does this behave like you > expect? > > valid = ~(edatmax.mask & edatmax.mask ) > > pylab.fill_between(xtelg,edatmax,edatmin,facecolor='green',alpha='0.3', > where=valid) > > > > Oops -- meant > > valid = ~(edatmin.mask & edatmax.mask ) > > JDH > |
|
From: Michael D. <md...@st...> - 2009-04-29 15:56:47
|
I don't believe fill_between directly supports missing values -- but it
does have the where parameter for this purpose.
We could also be smarter about how "where" is generated when none is
provided:
if where is None:
where = (~np.ma.getmaskarray(x) & ~np.ma.getmaskarray(y1) &
~np.ma.getmaskarray(y2))
...but I'd like more feedback from the author or users of fill_between
before committing that change. (That, and Eric Firing can probably find
a much more efficient way to do the masked array manipulation... ;)
Mike
Andres Luhamaa wrote:
> Hello,
> I try to do fill_between two arrays, that have missing value (masked
> arrays). Following code shows behaviour that seems not correct. Images
> what I expect the result to be (by omitting the missing value) and
> what I get by plotting the whole arrays.
>
> import pylab
> import numpy as np
> edatmax=np.array([10,4,6,9,np.nan,9,10])
> edatmax=np.ma.masked_array(edatmax,np.isnan(edatmax))
> edatmin=np.array([8,4,5,1,np.nan,8,5])
> edatmin=np.ma.masked_array(edatmin,np.isnan(edatmin))
> xtelg=np.arange(edatmax.size)
> xtelg=np.ma.masked_array(xtelg,np.isnan(edatmin))
> pylab.plot(edatmax,"gx")
> pylab.plot(edatmin,"r+")
> # comment out to see better
> pylab.fill_between(xtelg,edatmax,edatmin,facecolor='green',alpha='0.3')
> # comment in to see better
> #pylab.fill_between(xtelg[:4],edatmax[:4],edatmin[:4],facecolor='green',alpha='0.3')
>
> #pylab.fill_between(xtelg[5:],edatmax[5:],edatmin[5:],facecolor='green',alpha='0.3')
>
> pylab.show()
>
> Version of matplotlib is current cvs.
>
> Best regards,
> Andres
>
> ------------------------------------------------------------------------
>
>
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------
> Register Now & Save for Velocity, the Web Performance & Operations
> Conference from O'Reilly Media. Velocity features a full day of
> expert-led, hands-on workshops and two days of sessions from industry
> leaders in dedicated Performance & Operations tracks. Use code vel09scf
> and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
> ------------------------------------------------------------------------
>
> _______________________________________________
> Matplotlib-users mailing list
> Mat...@li...
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
--
Michael Droettboom
Science Software Branch
Operations and Engineering Division
Space Telescope Science Institute
Operated by AURA for NASA
|
|
From: John H. <jd...@gm...> - 2009-04-29 16:03:50
|
On Wed, Apr 29, 2009 at 10:56 AM, Michael Droettboom <md...@st...>wrote: > I don't believe fill_between directly supports missing values -- but it > does have the where parameter for this purpose. > > We could also be smarter about how "where" is generated when none is > provided: > > if where is None: > where = (~np.ma.getmaskarray(x) & ~np.ma.getmaskarray(y1) & > ~np.ma.getmaskarray(y2)) > > ...but I'd like more feedback from the author or users of fill_between > before committing that change. (That, and Eric Firing can probably find > a much more efficient way to do the masked array manipulation... ;) I'm working on a patch for this now....but I would also like Eric to take a look when I am done since I am a masked array dummy JDH |
|
From: John H. <jd...@gm...> - 2009-04-29 16:07:55
|
On Wed, Apr 29, 2009 at 11:03 AM, John Hunter <jd...@gm...> wrote:
>
>> ...but I'd like more feedback from the author or users of fill_between
>> before committing that change. (That, and Eric Firing can probably find
>> a much more efficient way to do the masked array manipulation... ;)
>
>
> I'm working on a patch for this now....but I would also like Eric to take a
> look when I am done since I am a masked array dummy
Here's the diff I just committed::
Index: lib/matplotlib/axes.py
===================================================================
--- lib/matplotlib/axes.py (revision 7069)
+++ lib/matplotlib/axes.py (working copy)
@@ -5832,6 +5832,26 @@
self._process_unit_info(xdata=x, ydata=y1, kwargs=kwargs)
self._process_unit_info(ydata=y2)
+ if where is None:
+ where = np.ones(len(x), np.bool)
+ else:
+ where = np.asarray(where)
+
+ maskedx = isinstance(x, np.ma.MaskedArray)
+ maskedy1 = isinstance(y1, np.ma.MaskedArray)
+ maskedy2 = isinstance(y2, np.ma.MaskedArray)
+
+ if (maskedx or maskedy1 or maskedy2):
+ if maskedx:
+ where = where & (~x.mask)
+
+ if maskedy1:
+ where = where & (~y1.mask)
+
+ if maskedy2:
+ where = where & (~y2.mask)
+
+
# Convert the arrays so we can work with them
x = np.asarray(self.convert_xunits(x))
y1 = np.asarray(self.convert_yunits(y1))
@@ -5843,10 +5863,7 @@
if not cbook.iterable(y2):
y2 = np.ones_like(x)*y2
- if where is None:
- where = np.ones(len(x), np.bool)
- where = np.asarray(where)
assert( (len(x)==len(y1)) and (len(x)==len(y2)) and
len(x)==len(where))
polys = []
|
|
From: Eric F. <ef...@ha...> - 2009-04-29 19:44:58
|
John Hunter wrote: > > > On Wed, Apr 29, 2009 at 11:03 AM, John Hunter <jd...@gm... > <mailto:jd...@gm...>> wrote: > > > ...but I'd like more feedback from the author or users of > fill_between > before committing that change. (That, and Eric Firing can > probably find > a much more efficient way to do the masked array manipulation... ;) > > > I'm working on a patch for this now....but I would also like Eric to > take a look when I am done since I am a masked array dummy > John, The way you did it looked OK; but since I was looking at it, I went ahead and did some rearranging and condensation to try to make the whole thing (not just the mask handling) read better. I doubt there are any significant performance differences, but I did not test that. I also added a subplot to the fill_between.py demo to illustrate the mask handling. Then I noticed a flaw in the demo plots, and added a note about it. See revision 7071. Eric |