Pablo Romero wrote: > > Im experiencing unexpected behavior with contourf. > Im trying to plot float values of '0.0', while also using the following > levels array with contourf(): > > Lv=(0,1,3,5,6,7,8,9,10,12,14,16,18,20,25,30,35,40,50,75) > > I've attached a sample image of the output. > the areas in white are contours where the plot values are exactly '0.0'.
The land areas, right? In a simple test, I don't see what you are describing: In [1]:Lv=(0,1,3,5,6,7,8,9,10,12,14,16,18,20,25,30,35,40,50,75) In [2]:norm = mpl.colors.BoundaryNorm(Lv,256) In [4]:norm([0.0]) Out[4]: masked_array(data = [0], mask = [False], fill_value = 999999) In [5]:z = linspace(0.0, 19.0, 20).reshape(4,5) In [6]:z Out[6]: array([[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [ 10., 11., 12., 13., 14.], [ 15., 16., 17., 18., 19.]]) In [7]:contourf(z, norm=norm) Out[7]:<matplotlib.contour.ContourSet instance at 0x9eaadac> In [8]:contourf(z, Lv, norm=norm) Out[8]:<matplotlib.contour.ContourSet instance at 0xa1ca98c> 0.0 is getting mapped to 0 by the norm, and that is used as an index to select the first cmap color, the darkest blue. Is your Z an ndarray or is it a masked array? What you describe is consistent with the 0 values actually being masked, so they are not being contoured at all--except that contourf has a bug with internal masked regions so that they don't always get left unfilled. In the example above, compare with In [15]:figure() Out[15]:<matplotlib.figure.Figure object at 0xa3879cc> In [16]:contourf(ma.masked_less_equal(z, 0.0), Lv, norm=norm) Out[16]:<matplotlib.contour.ContourSet instance at 0xa38790c> Now, the problem with this hypothesis is that printing the masked array does *not* show the 0.0 value: In [14]:print ma.masked_less_equal(z, 0.0) [[-- 1.0 2.0 3.0 4.0] [5.0 6.0 7.0 8.0 9.0] [10.0 11.0 12.0 13.0 14.0] [15.0 16.0 17.0 18.0 19.0]] so I don't understand what is going on in your case. What is the result from typing type(Z) norm([Z[-1,0]]) in ipython (after generating Z, of course)? > > I am not using the "extend='min|both'" in my contourf() function call. > If I use the "extend='min|both'" option, it will plot the '0.0' plot values > using the color of the 1st-2nd level (blue). However, for my application, I > DO NOT want to use the 'extend' option; I want my contour & colorbar levels > to start at 0. > We should figure out what the problem really is. If the 0.0 (land) values are being treated as below the 0 boundary, then you should be able to control their color like this: cmap = cm.jet cmap.set_under(cmap(0)) # to make it the same as the 0-1 color contourf(X, Y, Z, Lv, norm=norm, cmap=cmap) > So, in theory,the '0.0' float values *should* be considered to be at the > '0->1' range within my levels array, correct? > Yes, and as noted above, when I test it, it is. Eric > Im not sure how to create an example that can reproduce my data with '0.0' > float values. > this is more/less the basis of the code I used to create the attached plot > image: > > # assume Z is my dataset > > Z=create_my_data() > > # setup basemap instance > # I call contourf from the basemap instance > # but the problem still exists even when > # contourf is called from pyplot instance > > m=basemap(...) > ... > > print "Z: ",Z > > # this prints the following > # this is the best I can do to demonstrate what my data in 'Z' looks like > # > # Z: [[11.9459991455 11.9789991379 12.0119991302 ..., 8.51399993896 > # 8.05200004578 7.55699968338] > # [12.375 12.4079999924 12.4409999847 ..., 9.00899982452 8.57999992371 > # 8.08500003815] > # [12.8039999008 12.8369998932 12.8699998856 ..., 9.43799972534 > # 9.07499980927 8.64599990845] > # ..., > # [0.0 0.0 0.0 ..., 4.52099990845 5.2469997406 5.90700006485] > # [0.0 0.0 0.0 ..., 6.13800001144 6.33599996567 6.73199987411] > # [0.0 0.0 0.0 ..., 4.98299980164 5.64299964905 6.26999998093]] > > # my plotting code > > Lv=(0,1,3,5,6,7,8,9,10,12,14,16,18,20,25,30,35,40,50,75) > norm = mpl.colors.BoundaryNorm(Lv,256) > cs = m.contourf(X,Y,Z,Lv,norm=norm,cmap=cm.jet) > plt.colorbar(cs) > plt.show() > > > I believe that matplotlib is having issues with comparing the "zero"- value > level & '0.0' array values in my plot; it seems like its considering the > '0.0' values to be 'less than zero' and thus not plotting them within the > 'zero-through-one' level of my levels array. It seems as though its plotting > these '0.0' values using the color assigned to the cmap's "set_under" > property (anything below the 1st layer gets plotted in white or the > 'set_under' color). is this correct? > > Ive tried setting the first value in my levels array to '0.0' instead of just > '0', but the results were the same. > > Is this a bug; the fact that the '0.0' are not being associated with the '0' > level? > > Please help, > P.Romero ------------------------------------------------------------------------------ Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are powering Web 2.0 with engaging, cross-platform capabilities. Quickly and easily build your RIAs with Flex Builder, the Eclipse(TM)based development software that enables intelligent coding and step-through debugging. Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users