On 08/20/2010 10:14 AM, Bruce Ford wrote:
> This effect is happening within an web app that displays gridded
> fields from multiple datasets (~4500 lines of code).  So I it's tricky
> to create an example.  Although if I use numpy.min(grid) the minimum
> is 0.  So, I think colorbar or matplotlib is interpreting the 0 as -0.


You are talking about the colorbar tick labels, correct?  The lowest 
tick label is coming out as -0.0?


>   (Matplotlib version 0.99.0 RC0)
>
> The colorbar call that I'm using is:
>
> cbar = pyplot.colorbar(plot,shrink=0.7, format="%1.1f",
> spacing='proportional',orientation='vertical')

This means your colorbar tick values are simply being formatted by 
python, like this:

In [1]: "%1.1f" % -0.0000001
Out[1]: '-0.0'

In [2]: "%1.1f" % 0.0000001
Out[2]: '0.0'

In [3]: "%1.1f" % 0.0
Out[3]: '0.0'

In [4]: "%1.1f" % -0.0
Out[4]: '-0.0'

In [5]: import numpy

In [6]: numpy.min(-0.0)
Out[6]: -0

In [7]: -0.0 == 0.0
Out[7]: True


So I suspect the problem is that a small negative value, or a negative 
zero, is becoming the tick value.  I don't know why.  You may or may not 
want to investigate.

I dimly recall a problem like this cropping up on the list before--but I 
don't remember anything else about it.

Here is a workaround (untested, but should be close):

from matplotlib.ticker import FormatStrFormatter
class MyCBFormatter(FormatStrFormatter):
     def __call__(self, x, pos=None):
         xstr = self.fmt % x
         if float(xstr) == 0:
             return self.fmt % 0
         return xstr
cbar = pyplot.colorbar(plot,shrink=0.7, format=MyCBFormatter("%1.1f"),
          spacing='proportional',orientation='vertical')


Eric

>
> cbar.ax.set_ylabel(cbar_label(param,unit))
>
> The function cbar_label is:
>
> def cbar_label(param,unit):
>      #Helper function for making colorbar label
>      if param == "sig":
>          if unit==1:
>              cbar_label = "Feet"
>          else:
>              cbar_label = "Meters"
>      elif param == "dir":
>          cbar_label = "Radial Direction"
>      elif param == "per":
>          cbar_label = "Seconds"
>      elif param[-5:] == "_wind":
>          if unit == 3:
>              cbar_label = "Kts"
>          else:
>              cbar_label = "M/S"
>      elif param[-4:] == "_hgt":
>          if unit == 5:
>              cbar_label = "GPFt"
>          else:
>              cbar_label = "GPM"
>      elif param == "slp":
>          cbar_label = "Millibars"
>      elif param == "1000_rh":
>          cbar_label = "%"
>      elif param == "1000_temp":
>          if unit == 9:
>              cbar_label = "Degrees F"
>          else:
>              cbar_label = "Degrees C"
>      else:
>          cbar_label = param
>      return cbar_label
>
> If this doesn't offer anything, I'll try to generate a
> compartmentalized example of the issue.
>
> Bruce

------------------------------------------------------------------------------
This SF.net email is sponsored by 

Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev 
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to