Ignore:
Timestamp:
07/09/09 12:52:39 (11 years ago)
Author:
pnorton
Message:

Improved the colour bar code so it now accepts the data array instead of just a minimum + maximum. It also now defaults to creating a Normalize instance with vmin=None and vmax=None instead of 0 and 1.

Also modified the layer_drawer objects to use the ColourBar? class instead of implementing it themselves.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • qesdi/geoplot/trunk/lib/geoplot/colour_bar.py

    r5610 r5688  
    22import math 
    33import logging 
     4import numpy 
    45 
    56import matplotlib.colors 
     
    89from matplotlib.colorbar import ColorbarBase 
    910import matplotlib.cm as cm 
     11import operator 
    1012 
    1113import geoplot.config as geoplot_config 
     
    1820 
    1921FONTS_SECTION = 'Fonts' 
    20  
    21  
    2222MAX_CBAR_TICKS = 10 
    2323ADJUSTED_TICK_FORMAT = "%1.2f" 
     
    2626 
    2727    def __init__(self, colourBarLabel="",colourBarPosition='horizontal',  
    28                        cmap=None, colourBarMin=None, colourBarMax=None ): 
     28                       cmap=None, colourBarMin=None, colourBarMax=None, 
     29                       hideOutsideBounds=False): 
    2930 
    3031        self._position = None 
     
    3738        self.colourBarMin = colourBarMin 
    3839        self.colourBarMax = colourBarMax 
     40        self.hideOutsideBounds = hideOutsideBounds 
    3941         
    4042        self.labelFont = config[FONTS_SECTION]['ColourBarLabel'] 
    4143 
    42     def draw(self, colourBarAxis, fontSize='medium', dataMin=None, dataMax=None): 
     44    def draw(self, colourBarAxis, fontSize='medium', data=None): 
    4345        """ 
    4446        Adds the colour bar to the (and optionally a label) to the figure. 
     
    5355        cmap = self.getColourMap() 
    5456 
    55         norm = self.getNormalize(dataMin, dataMax) 
     57        norm = self.getNormalize(data) 
    5658         
    5759        cb = ColorbarBase(colourBarAxis, 
     
    7880        else: 
    7981            cmap = self.cmap 
     82             
     83        if self.hideOutsideBounds: 
     84            log.debug("self.hideOutsideBounds = %s" % (self.hideOutsideBounds,)) 
     85            cmap.set_under('0.25', alpha=0.0) 
     86            cmap.set_over('0.75', alpha=0.0) 
    8087             
    8188        return cmap 
     
    149156            cb.ax.xaxis.set_ticks_position('default') 
    150157     
    151     def getNormalize(self, dataMin=None, dataMax=None): 
    152          
    153         min, max = self.colourBarMin, self.colourBarMax 
    154          
    155         if dataMax.__class__.__name__ == 'MaskedArray': 
    156             dataMax = None 
    157              
    158         if dataMin.__class__.__name__ == 'MaskedArray': 
    159             dataMin = None 
    160          
    161         if min is None and not dataMin is None: 
    162             min = dataMin 
    163         elif min is None: 
    164             min = 0 
    165              
    166         if max is None and not dataMax is None: 
    167             max = dataMax 
    168         elif max is None: 
    169             max = 1 
    170          
    171         if min > max: 
    172             log.warning("min(=%s) > max(=%s) reversing values" % (min, max)) 
    173             max, min = min, max 
    174              
    175          
    176         return matplotlib.colors.Normalize(min,  max) 
    177      
     158    def getNormalize(self, data=None): 
     159         
     160        cbMin = self.colourBarMin 
     161        cbMax = self.colourBarMax 
     162         
     163        if cbMin is not None and cbMax is not None and cbMin > cbMax: 
     164            log.warning("min(=%s) > max(=%s) reversing values" % (cbMin, cbMax)) 
     165            cbMax, cbMin = cbMin, cbMax 
     166         
     167        norm = matplotlib.colors.Normalize(cbMin,  cbMax) 
     168         
     169        # this should work event if data is none (as N.ma.maximum(None) = None) 
     170        norm.autoscale_None(data) 
     171         
     172        # check for masked values in vmin and vmax, can occur when data is completly masked 
     173        if norm.vmin.__class__ == numpy.ma.MaskedArray and norm.vmin.mask == True: 
     174            norm.vmin = None 
     175             
     176        if norm.vmax.__class__ == numpy.ma.MaskedArray and norm.vmax.mask == True: 
     177            norm.vmax = None 
     178 
     179        return norm 
     180     
     181    def _getColourBarLimit(self, limit, data=None): 
     182        assert limit in ['min','max'] 
     183         
     184        #use the value set 
     185        if limit == 'min': 
     186            setVal = self.colourBarMin 
     187        else: 
     188            setVal = self.colourBarMax 
     189         
     190        # if there is no vlaue set try using the data to get 
     191        # the min and max 
     192        if setVal is None: 
     193             
     194            dataVal = None 
     195             
     196            if data is not None: 
     197                if limit == 'min': 
     198                    dataVal = data.min() 
     199                else: 
     200                    dataVal = data.max() 
     201                 
     202                # can't use a masked array as the min or max value 
     203                if dataVal.__class__.__name__ == 'MaskedArray': 
     204                    dataMin = None 
     205             
     206            if dataVal is not None: 
     207                setVal = dataVal 
     208            else: 
     209                if limit == 'min': 
     210                    setVal = 0 
     211                else: 
     212                    setVal = 1 
     213         
     214        return setVal 
    178215     
    179216     
     
    236273        log.warning("cmapRange[0] > cmapRange[1], swapping values") 
    237274        cmapRange = (cmapRange[1], cmapRange[0]) 
    238  
    239     cb = ColorbarBase(axes, cmap=cmap, norm=matplotlib.colors.Normalize(cmapRange[0],cmapRange[1]),  
    240                       orientation=orientation) 
    241      
    242     if label != None: 
    243         cb.set_label(label, weight='normal') 
     275     
     276    cb = ColourBar(colourBarLabel=label,  
     277                   colourBarPosition=orientation,  
     278                   cmap=cmap,  
     279                   colourBarMin=cmapRange[0],  
     280                   colourBarMax=cmapRange[1] ) 
     281     
     282    cb.draw(axes)     
     283     
     284#    cb = ColorbarBase(axes, cmap=cmap, norm=matplotlib.colors.Normalize(cmapRange[0],cmapRange[1]),  
     285#                      orientation=orientation) 
     286#     
     287#    if label != None: 
     288#        cb.set_label(label, weight='normal') 
    244289 
    245290    return geoplot.utils.figureToImage(fig) 
Note: See TracChangeset for help on using the changeset viewer.