Changeset 6103


Ignore:
Timestamp:
09/12/09 16:08:34 (10 years ago)
Author:
pnorton
Message:

Trying to get the different colour bars and plot options to work with the different legend types.

Location:
qesdi/geoplot/trunk/lib/geoplot
Files:
7 edited

Legend:

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

    r6089 r6103  
    2424    LEGEND='legend' 
    2525    CONTINUOUS = 'continuous'  
     26    LINE = 'line' 
    2627 
    2728    @staticmethod 
    2829    def all(): 
    29         return [COLOUR_BAR_STYLES.CONTINUOUS, COLOUR_BAR_STYLES.LEGEND] 
     30        return [COLOUR_BAR_STYLES.CONTINUOUS, COLOUR_BAR_STYLES.LEGEND, COLOUR_BAR_STYLES.LINE] 
    3031 
    3132class COLOUR_SCHEME_SCALE: 
     
    5758        log.debug("drawing colour bar") 
    5859         
    59         if self.colourBarStyle == 'legend': 
     60        if self.colourBarStyle == COLOUR_BAR_STYLES.LEGEND: 
    6061            self._drawLegendColourBar(colourBarAxis, colourScheme, fontSize) 
     62        elif self.colourBarStyle == COLOUR_BAR_STYLES.LINE: 
     63            self._drawLineColourBar(colourBarAxis, colourScheme, fontSize) 
    6164        else: 
    6265            self._drawContiunousColourBar(colourBarAxis, colourScheme, fontSize) 
     
    7578         
    7679        if intervalColourbar: 
    77             kwargs['ticks'] = colourScheme.labelLocations 
     80            kwargs['ticks'] = colourScheme.midpoints 
    7881            kwargs['format'] = matplotlib.ticker.FixedFormatter(colourScheme.labels) 
    7982            kwargs['spacing'] = 'proportional' 
     
    100103        norm = colourScheme.norm 
    101104         
    102         locations, labels = colourScheme.labelLocations, colourScheme.labels 
     105        locations, labels = colourScheme.midpoints, colourScheme.labels 
    103106 
    104107        kwargs['orientation'] = self.colourBarPosition 
     
    130133                 
    131134        return leg 
     135     
     136    def _drawLineColourBar(self, colourBarAxis, colourScheme, fontSize): 
     137        """ 
     138         
     139        """ 
     140        kwargs = {} 
     141         
     142        cmap = colourScheme.colourMap 
     143        norm = colourScheme.norm 
     144        levels = colourScheme.bounds 
     145        colours = [cmap(norm(x)) for x in levels] 
     146        widths = [1.0 for x in levels] 
     147         
     148         
     149        cb = ColorbarBase(colourBarAxis, norm=norm,  
     150                          orientation='horizontal',  
     151                          filled=False) 
     152         
     153        cb.add_lines(levels, colours, widths) 
     154 
     155#        colourBarAxis.set_xticks([]) 
     156#        colourBarAxis.set_yticks([]) 
     157         
     158        if self.colourBarLabel != None: 
     159            labelDictionary = self.labelFont.getDict(fontSize) 
     160            cb.set_label(self.colourBarLabel, fontdict=labelDictionary) 
     161         
     162        return cb 
    132163         
    133164    @staticmethod 
  • qesdi/geoplot/trunk/lib/geoplot/colour_scheme.py

    r6089 r6103  
    3333class IntervalColourScheme(ColourScheme): 
    3434         
    35     def __init__(self, colourMap, norm, scale, labels, labelLocations): 
     35    def __init__(self, colourMap, norm, scale, labels, midpoints, bounds, labelFormat): 
    3636        self.labels = labels 
    37         self.labelLocations = labelLocations 
     37        self.midpoints = midpoints 
     38        self.bounds = bounds 
     39        self.labelFormat = labelFormat 
    3840        ColourScheme.__init__(self, colourMap, norm, scale) 
    3941         
     
    4749                 hideOutsideBounds=False, 
    4850                 numIntervals=6, 
     51                 labelFormat=None, 
    4952                 intervals=None, 
    5053                 intervalNames=None): 
     
    6164        self.intervalNames = intervalNames 
    6265        self._intervalBuilder = ColourSchemeIntervalBuilder() 
     66        self.labelFormat = labelFormat 
    6367         
    6468    def buildScheme(self, colourBarStyle, grid=None): 
     
    6771        initialCmap = self._getColourMap() 
    6872         
    69         assert colourBarStyle in COLOUR_BAR_STYLES.all() 
    70          
    71         if colourBarStyle == COLOUR_BAR_STYLES.LEGEND: 
     73        assert colourBarStyle in COLOUR_BAR_STYLES.all(), " %s not in %s" % (colourBarStyle, COLOUR_BAR_STYLES.all()) 
     74 
     75         
     76        if self.labelFormat is None: 
     77            if self.colourBarScale == COLOUR_SCHEME_SCALE.LINEAR: 
     78                self.labelFormat = "%.2f" 
     79            else: 
     80                self.labelFormat = "%.1E" 
     81  
     82         
     83        if colourBarStyle in [COLOUR_BAR_STYLES.LEGEND, 
     84                              COLOUR_BAR_STYLES.LINE]: 
    7285            builder = self._getIntervalBuilder(cbRange, initialCmap) 
    7386        else: 
     
    8396    def _getIntervalBuilder(self,cbRange, initialCmap): 
    8497         
    85         interval = self._intervalBuilder.buildCSInterval(cbRange, self.intervals, self.intervalNames, numIntervals=self.numIntervals) 
     98        interval = self._intervalBuilder.buildCSInterval(cbRange, self.colourBarScale, self.labelFormat,  
     99                                                         self.intervals, self.intervalNames,  
     100                                                         numIntervals=self.numIntervals) 
    86101        log.debug("interval = %s" % (interval,)) 
    87         builder = _IntervalSchemeBuidler(cbRange, self.colourBarScale, initialCmap, interval) 
     102        builder = _IntervalSchemeBuidler(cbRange, self.colourBarScale, initialCmap, interval, self.labelFormat) 
    88103         
    89104        return builder 
     
    193208class _IntervalSchemeBuidler(): 
    194209     
    195     def __init__(self, cbRange, cbScale, initialCmap, csInterval): 
     210    def __init__(self, cbRange, cbScale, initialCmap, csInterval, labelFormat): 
    196211        self.cbRange = cbRange 
    197212        self.cbScale = cbScale 
    198213        self.initialCmap = initialCmap 
    199214        self.csInterval = csInterval 
     215        self.labelFormat = labelFormat 
    200216         
    201217    def buildScheme(self): 
     
    209225        norm = self._getNorm() 
    210226         
    211         return IntervalColourScheme(cmap, norm, self.cbScale, labels, self.csInterval.midpoints) 
     227        return IntervalColourScheme(cmap, norm, self.cbScale, labels, self.csInterval.midpoints, self.csInterval.bounds, self.labelFormat) 
    212228     
    213229    def _buildColourMap(self): 
  • qesdi/geoplot/trunk/lib/geoplot/colour_scheme_intervals.py

    r6089 r6103  
    77import numpy 
    88import utils 
     9from geoplot.colour_bar import COLOUR_SCHEME_SCALE 
     10 
    911 
    1012DEFAULT_NUM_INTERVALS = 6 
     
    2729        pass 
    2830     
    29     def buildCSInterval(self, cbRange, boundsString=None, labelsString=None, numIntervals=None): 
     31    def buildCSInterval(self, cbRange, scale, labelFormat="%.2f", boundsString=None, labelsString=None, numIntervals=None): 
    3032         
    3133        bounds = None 
     
    4648                numIntervals = DEFAULT_NUM_INTERVALS 
    4749                 
    48             bounds = self._getBoundsFromRange(cbRange, numIntervals) 
     50            bounds = self._getBoundsFromRange(cbRange, scale, numIntervals) 
    4951             
    50         interval = self._buildCSIntervalFromBounds(bounds, labelsString)         
     52        interval = self._buildCSIntervalFromBounds(bounds, labelsString, labelFormat)         
    5153         
    5254        return interval 
    5355         
    54     def _buildCSIntervalFromBounds(self, bounds, labelsString=None): 
     56    def _buildCSIntervalFromBounds(self, bounds, labelsString, labelFormat): 
    5557        """ 
    5658        Builds a _ColourSchemeInterval object from a list of bounds. 
    5759        """ 
    5860        midpoints = utils.getMidpoints(bounds) 
    59         boundStrings = [str(utils.round_to_n(x,2)) for x in bounds] 
    6061 
    6162        labels = self._getLabels(labelsString) 
     
    6970        # build some default labels 
    7071        if labels is None: 
    71             labels  = ["%s - %s" % (boundStrings[index], boundStrings[index + 1]) for index in range(len(boundStrings)-1)] 
     72            lfString = labelFormat + " - " + labelFormat 
     73            labels  = [ lfString % (bounds[index], bounds[index + 1]) for index in range(len(bounds)-1)] 
    7274             
    7375        return ColourSchemeInterval(midpoints, bounds, labels) 
     
    119121                break 
    120122             
    121         print newBounds 
    122123        if upperBoundRemoved: 
    123124            newBounds = numpy.append(newBounds, cbRange.maximum) 
     
    125126        return newBounds 
    126127         
    127     def _getBoundsFromRange(self, cbRange, numLabels): 
     128    def _getBoundsFromRange(self, cbRange, scale, numLabels): 
    128129        """ 
    129130        This function uses the minimum and maximum of the values to 
    130131        create MAX_INTERVALS bounds which are returned as a numpy array. 
    131132        """ 
    132                          
    133         interval = (cbRange.maximum - cbRange.minimum)/float(numLabels) 
    134         bounds = numpy.arange(cbRange.minimum, cbRange.maximum, interval) 
    135          
    136         #include the upper bound 
    137         bounds =numpy.append(bounds, cbRange.maximum) 
     133 
     134        if scale == COLOUR_SCHEME_SCALE.LOG: 
     135 
     136            lmin = numpy.log10(cbRange.minimum) 
     137            lmax = numpy.log10(cbRange.maximum) 
     138             
     139            bounds = numpy.logspace(lmin, lmax, numLabels + 1) 
     140        else: 
     141            bounds = numpy.linspace(cbRange.minimum, cbRange.maximum, numLabels + 1) 
    138142         
    139143        return bounds                 
  • qesdi/geoplot/trunk/lib/geoplot/contour_drawer.py

    r5946 r6103  
    4545        self._contourFont = config['Fonts']['ContourLines'] 
    4646         
    47     def draw(self, axes, grid, basemap=None, normalize=None, cmap=None, scale=COLOUR_SCHEME_SCALE.LINEAR, fontSize='medium'): 
     47    def draw(self, axes, grid, scheme, basemap=None, fontSize='medium'): 
    4848        """ 
    4949        Draws contour lines from the grid's data on the axis. 
     
    5656            drawn on the axis. 
    5757        """ 
    58  
    59         if cmap == None: 
    60             cmap = matplotlib.cm.get_cmap() 
    61             cmap.set_bad("w") 
    6258             
    6359        #transform the grid data to the correct projection 
    6460        grid_mapUnits = grid.transform(basemap) 
    6561                 
    66         self._drawContours(axes, cmap, grid_mapUnits, normalize, fontSize, scale) 
     62        self._drawContours(axes, scheme, grid_mapUnits, fontSize) 
    6763         
    68     def _drawContours(self, axes, cmap, grid_mapUnits, normalize, fontSize, scale): 
     64    def _drawContours(self, axes, scheme, grid_mapUnits, fontSize): 
    6965        """ 
    7066        Draws the contour lines onto the axes. 
     
    7571         
    7672        if valuesFound == True: 
    77  
    78  
    79             if normalize == None : 
    80                 normalize = matplotlib.colors.Normalize(0, 1) 
    81  
    82             log.debug("scale = %s" % (scale,)) 
    83             if scale == COLOUR_SCHEME_SCALE.LOG: 
    84  
    85                 #lev_exp = np.arange(np.floor(np.log10(z.min())-1), 
    86                 #                       np.ceil(np.log10(z.max())+1)) 
    87                 #levs = np.power(10, lev_exp) 
    88                 lmin = N.log10(normalize.vmin) 
    89                 lmax = N.log10(normalize.vmax) 
    90                 levels = N.logspace(lmin, lmax,  self.numContourLines) 
    91                 labelFormat = "%.1E"  
    92             else: 
    93                 levels = N.linspace(normalize.vmin, normalize.vmax, self.numContourLines) 
    94                 labelFormat = "%1.3f" 
     73             
     74#            if scheme.scale == COLOUR_SCHEME_SCALE.LOG: 
     75# 
     76#                #lev_exp = np.arange(np.floor(np.log10(z.min())-1), 
     77#                #                       np.ceil(np.log10(z.max())+1)) 
     78#                #levs = np.power(10, lev_exp) 
     79#                lmin = N.log10(scheme.norm.vmin) 
     80#                lmax = N.log10(scheme.norm.vmax) 
     81#                levels = N.logspace(lmin, lmax,  self.numContourLines) 
     82#                labelFormat = "%.1E"  
     83#            else: 
     84#                levels = N.linspace(scheme.norm.vmin, scheme.norm.vmax, self.numContourLines) 
     85#                labelFormat = "%1.3f" 
    9586             
    9687             
    97             extent=(grid_mapUnits.boundsX.min(), grid_mapUnits.boundsX.max(), 
    98                     grid_mapUnits.boundsY.min(), grid_mapUnits.boundsY.max()) 
    9988             
    10089            CS = axes.contour(grid_mapUnits.midpointsX,  
    10190                              grid_mapUnits.midpointsY,  
    10291                              grid_mapUnits.values, 
    103                               levels, 
    104                  cmap=cmap, 
     92                              scheme.bounds, 
     93                 cmap=scheme.colourMap, 
    10594                 origin='lower', 
    10695                 linewidths=self.contourLineWidth, 
    107                  norm=normalize, 
     96                 norm=scheme.norm, 
    10897                 extend='neither', 
    10998                 ) 
     
    111100            labelDictionary = self._contourFont.getDict(fontSize) 
    112101             
    113             axes.clabel(CS,levels[0::self.contourLabelInterval], fontsize=labelDictionary['size'], 
    114                         fmt=labelFormat) 
     102            axes.clabel(CS, 
     103                        scheme.bounds[0::self.contourLabelInterval],  
     104                        fontsize=labelDictionary['size'], 
     105                        fmt=scheme.labelFormat) 
    115106             
    116107            axes.set_aspect('auto') 
  • qesdi/geoplot/trunk/lib/geoplot/filtered_basemap.py

    r5710 r6103  
    2424 
    2525from matplotlib.collections import LineCollection 
     26import matplotlib.pyplot as plt 
    2627 
    2728from geoplot.utils import ispointInLimits, isRangeInLimits 
  • qesdi/geoplot/trunk/lib/geoplot/layer_drawer_contour.py

    r6089 r6103  
    1616                 lineWidth=0.5, **kwargs): 
    1717         
     18        LayerDrawerBase.__init__(self, **kwargs) 
     19         
    1820        self._contourDrawer = ContourDrawer() 
    19         self.numLines = numLines 
    2021        self.cdmsVar = cdmsVar 
    2122        self.fontSize = fontSize 
     
    2324        self.lineWidth = lineWidth 
    2425        log.debug("kwargs = %s" % (kwargs,)) 
    25         LayerDrawerBase.__init__(self, **kwargs) 
     26        self.numLines = numLines 
    2627         
    2728    def _drawToAxes(self, axes, xLimits, yLimits): 
     
    4748        cmap.set_bad('w', 0.0) 
    4849         
    49         self._contourDrawer.draw(axes, grid, normalize=scheme.norm, cmap=cmap, 
    50                                  basemap=basemap, fontSize=self.fontSize, 
    51                                  scale=scheme.scale) 
     50        self._contourDrawer.draw(axes, grid, scheme, 
     51                                 basemap=basemap, fontSize=self.fontSize) 
    5252     
    5353    ### properties ### 
    5454           
    5555    def __set_numLines(self, value): 
    56         self._contourDrawer.numContourLines = value 
     56        self._csBuilder.numIntervals = value - 1 
    5757     
    5858    def __get_numLines(self): 
    59         return self._contourDrawer.numContourLines 
     59        return self._csBuilder.numIntervals + 1 
    6060 
    6161    numLines = property(__get_numLines, __set_numLines) 
  • qesdi/geoplot/trunk/lib/geoplot/tests/unit/test_colour_bar.py

    r6089 r6103  
    1717        self.cb = geoplot.colour_bar.ColourBar('label', 'horizontal', 'legend') 
    1818        self.mockAxes = Mock(spec=matplotlib.axes.Axes)  
    19  
    2019 
    2120    def tearDown(self): 
     
    3938    def test_002_drawLegendColourBar(self): 
    4039         
    41          
    4240        scheme = Mock(spec=geoplot.colour_scheme.IntervalColourScheme) 
    4341        scheme._methods.extend(['colourMap','norm', 'scale', 'labels', 'labelLocations']) 
     
    5351        nt.assert_equal(callArgs[0][1], scheme.labels) 
    5452 
    55          
    56  
    5753if __name__ == '__main__': 
    5854    print "Running tests in", __file__ 
Note: See TracChangeset for help on using the changeset viewer.