Changeset 5946


Ignore:
Timestamp:
03/11/09 13:33:25 (10 years ago)
Author:
pnorton
Message:

Added the ability to set the scale on the colour scheme to a log scale.

Location:
qesdi/geoplot/trunk/lib/geoplot
Files:
2 added
11 edited

Legend:

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

    r5886 r5946  
    1212import geoplot.config as geoplot_config 
    1313import geoplot 
     14 
     15from geoplot.colour_scheme import COLOUR_SCHEME_SCALE 
    1416 
    1517 
     
    215217                      colourBarMin=None,  
    216218                      colourBarMax=None,  
     219                      colourBarScale=COLOUR_SCHEME_SCALE.LINEAR, 
    217220                      orientation='horizontal', 
    218221                      intervals=None, 
     
    225228     
    226229    #build a colour scheme 
    227      
     230    log.debug("colourBarScale = %s" % (colourBarScale,)) 
    228231    schemeBuilder = geoplot.colour_scheme.ColourSchemeBuilder(cmap=cmap,  
    229232                 colourBarMin=colourBarMin,  
    230233                 colourBarMax=colourBarMax,  
     234                 colourBarScale=colourBarScale, 
    231235                 intervals=intervals, 
    232236                 intervalNames=intervalNames) 
    233237     
    234238    colourScheme = schemeBuilder.buildScheme()     
    235      
     239    log.debug("colourScheme.norm.__class__ = %s" % (colourScheme.norm.__class__,)) 
    236240    #for agg bakcend 
    237241    #need about 40px at the bottom of the axes to draw the labels 
  • qesdi/geoplot/trunk/lib/geoplot/colour_scheme.py

    r5890 r5946  
    2121log = logging.getLogger(__name__) 
    2222 
     23 
     24class COLOUR_SCHEME_SCALE: 
     25    LINEAR='linear' 
     26    LOG='log' 
     27 
     28 
    2329class ColourScheme(object): 
    2430     
    25     def __init__(self, colourMap, norm): 
     31    def __init__(self, colourMap, norm, scale): 
    2632        self.colourMap = colourMap 
    2733        self.norm = norm 
     34        self.scale = scale 
    2835 
    2936class ContinuousColourScheme(ColourScheme): 
     
    3138 
    3239class IntervalColourScheme(ColourScheme): 
    33     def __init__(self, colourMap, norm, labels, labelLocations): 
     40    def __init__(self, colourMap, norm, scale, labels, labelLocations): 
    3441        self.labels = labels 
    3542        self.labelLocations = labelLocations 
    36         ColourScheme.__init__(self, colourMap, norm) 
     43        ColourScheme.__init__(self, colourMap, norm, scale) 
    3744         
    3845 
     
    4148    def __init__(self, cmap=None,  
    4249                 colourBarMin=None,  
    43                  colourBarMax=None,  
     50                 colourBarMax=None, 
     51                 colourBarScale=COLOUR_SCHEME_SCALE.LINEAR,  
    4452                 hideOutsideBounds=False, 
    4553                 intervals=None, 
     
    4957        self.colourBarMin = colourBarMin 
    5058        self.colourBarMax = colourBarMax 
     59        self.colourBarScale = colourBarScale 
    5160        self.hideOutsideBounds = hideOutsideBounds 
    5261        self.intervals = intervals 
     
    5968         
    6069        if self.intervals != None: 
    61             builder = _IntervalSchemeBuidler(cbRange, initialCmap, self.intervals, self.intervalNames) 
    62         else: 
    63             builder = _ConinuousSchemeBuilder(cbRange, initialCmap) 
     70            builder = _IntervalSchemeBuidler(cbRange, self.colourBarScale, initialCmap, self.intervals, self.intervalNames) 
     71        else: 
     72            builder = _ConinuousSchemeBuilder(cbRange, self.colourBarScale, initialCmap) 
    6473 
    6574        scheme = builder.buildScheme(grid) 
     
    109118    """ 
    110119     
    111     def __init__(self, cbRange, initialCmap): 
     120    def __init__(self, cbRange, cbScale, initialCmap): 
    112121        self.cbRange = cbRange 
    113122        self.initialCmap = initialCmap 
     123        self.cbScale = cbScale 
    114124     
    115125    def buildScheme(self, grid=None): 
    116126        cmap = self._buildColourMap() 
    117127        norm = self._buildNorm(grid) 
    118         return ContinuousColourScheme(cmap, norm) 
     128        return ContinuousColourScheme(cmap, norm, self.cbScale) 
    119129     
    120130    def _buildColourMap(self): 
     
    122132     
    123133    def _buildNorm(self, grid): 
    124         norm = matplotlib.colors.Normalize(self.cbRange.minimum,  self.cbRange.maximum) 
     134         
     135        norm = None 
     136         
     137        cbMin, cbMax = self.cbRange.minimum, self.cbRange.maximum 
    125138         
    126139        if not grid is None: 
    127             if norm.vmin is None: norm.vmin = grid.getMinValue()  
    128             if norm.vmax is None: norm.vmax = grid.getMaxValue()  
     140            vmin = cbMin if cbMin != None else grid.getMinValue() 
     141            vmax = cbMax if cbMax != None else grid.getMaxValue() 
     142        else: 
     143            vmin = cbMin 
     144            vmax = cbMax 
     145         
     146        if self.cbScale == 'log': 
     147             
     148            if vmin is not None and vmin > 0 and vmax is not None and vmax > 0: 
     149                norm = matplotlib.colors.LogNorm(vmin, vmax) 
     150            else: 
     151                log.warning("Can't create a log colour scheme with min = %s and max = %s"  
     152                             % (vmin, vmax)) 
     153                 
     154         
     155        if norm == None:     
     156            norm = matplotlib.colors.Normalize(vmin, vmax) 
     157         
    129158         
    130159        # check for masked values in vmin and vmax, can occur when data is completly masked 
     
    139168class _IntervalSchemeBuidler(): 
    140169     
    141     def __init__(self, cbRange, initialCmap, intervalBoundsString, intervalLabelsString=None): 
     170    def __init__(self, cbRange, cbScale, initialCmap, intervalBoundsString, intervalLabelsString=None): 
    142171        self.cbRange = cbRange 
     172        self.cbScale = cbScale 
    143173        self.initialCmap = initialCmap 
    144174        self.intervalBoundsString = intervalBoundsString 
     
    162192        norm = self._getNorm(csInterval) 
    163193         
    164         return IntervalColourScheme(cmap, norm, labels, csInterval.midpoints) 
     194        return IntervalColourScheme(cmap, norm, self.cbScale, labels, csInterval.midpoints) 
    165195     
    166196    def _buildColourMap(self, csInterval): 
  • qesdi/geoplot/trunk/lib/geoplot/config.ini

    r5890 r5946  
    1010colourBarMin = None 
    1111colourBarMax = None 
     12colourBarScale = 'linear' 
    1213cmap = jet 
    1314intervalNames = None 
  • qesdi/geoplot/trunk/lib/geoplot/contour_drawer.py

    r5753 r5946  
    2121from geoplot.array_util import * 
    2222import geoplot.config as geoplot_config 
     23from geoplot.colour_scheme import COLOUR_SCHEME_SCALE  
     24 
    2325 
    2426config = geoplot_config.getConfig() 
     
    4345        self._contourFont = config['Fonts']['ContourLines'] 
    4446         
    45     def draw(self, axes, grid, basemap=None, normalize=None, cmap=None, fontSize='medium'): 
     47    def draw(self, axes, grid, basemap=None, normalize=None, cmap=None, scale=COLOUR_SCHEME_SCALE.LINEAR, fontSize='medium'): 
    4648        """ 
    4749        Draws contour lines from the grid's data on the axis. 
     
    6264        grid_mapUnits = grid.transform(basemap) 
    6365                 
    64         self._drawContours(axes, cmap, grid_mapUnits, normalize, fontSize) 
     66        self._drawContours(axes, cmap, grid_mapUnits, normalize, fontSize, scale) 
    6567         
    66     def _drawContours(self, axes, cmap, grid_mapUnits, normalize, fontSize): 
     68    def _drawContours(self, axes, cmap, grid_mapUnits, normalize, fontSize, scale): 
    6769        """ 
    6870        Draws the contour lines onto the axes. 
     
    7476        if valuesFound == True: 
    7577 
     78 
    7679            if normalize == None : 
    7780                normalize = matplotlib.colors.Normalize(0, 1) 
    78                          
    79             levels = N.linspace(normalize.vmin, normalize.vmax, self.numContourLines) 
     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" 
     95             
    8096             
    8197            extent=(grid_mapUnits.boundsX.min(), grid_mapUnits.boundsX.max(), 
     
    95111            labelDictionary = self._contourFont.getDict(fontSize) 
    96112             
    97             axes.clabel(CS,levels[0::self.contourLabelInterval], fontsize=labelDictionary['size']) 
     113            axes.clabel(CS,levels[0::self.contourLabelInterval], fontsize=labelDictionary['size'], 
     114                        fmt=labelFormat) 
    98115             
    99116            axes.set_aspect('auto') 
  • qesdi/geoplot/trunk/lib/geoplot/layer_drawer.py

    r5876 r5946  
    3636                 colourBarMin=None, 
    3737                 colourBarMax=None,  
     38                 colourBarScale='linear', 
    3839                 intervals=None,  
    3940                 bgcolour='white'): 
     
    4344        self._bgcolour = 'white' 
    4445         
     46        self.colourBarScale = colourBarScale 
    4547        self.transparent = transparent 
    4648        self.cmap = cmap 
     
    270272 
    271273    colourBarMax = property(__get_colourBarMax, __set_colourBarMax) 
    272          
     274     
     275    def __set_colourBarScale(self, value): 
     276        self._csBuilder.colourBarScale = value 
     277     
     278    def __get_colourBarScale(self): 
     279        return self._csBuilder.colourBarScale 
     280 
     281    colourBarScale = property(__get_colourBarScale, __set_colourBarScale) 
     282             
    273283    def __set_bgcolour(self, value): 
    274284         
  • qesdi/geoplot/trunk/lib/geoplot/layer_drawer_contour.py

    r5876 r5946  
    2222        self.labelInterval =labelInterval 
    2323        self.lineWidth = lineWidth 
    24          
     24        log.debug("kwargs = %s" % (kwargs,)) 
    2525        LayerDrawerBase.__init__(self, **kwargs) 
    2626         
     
    4848         
    4949        self._contourDrawer.draw(axes, grid, normalize=scheme.norm, cmap=cmap, 
    50                                  basemap=basemap, fontSize=self.fontSize) 
     50                                 basemap=basemap, fontSize=self.fontSize, 
     51                                 scale=scheme.scale) 
    5152     
    5253    ### properties ### 
  • qesdi/geoplot/trunk/lib/geoplot/layer_drawer_grid_fast.py

    r5890 r5946  
    2222                 colourBarMin=None, 
    2323                 colourBarMax=None,  
    24                  transparent=False,  
     24                 transparent=False, 
     25                 colourBarScale='linear', 
    2526                 intervals=None,  
    2627                 bgcolour='white'): 
     
    3738        self.bgcolour = bgcolour 
    3839         
     40        self.colourBarScale = colourBarScale 
    3941        self.colourBarMin = colourBarMin 
    4042        self.colourBarMax = colourBarMax 
  • qesdi/geoplot/trunk/lib/geoplot/tests/drawing/draw_test_layer_drawer_grid.py

    r5890 r5946  
    3838    width = 600; height=900 
    3939     
    40     var = makeLLVar(lonBounds=xLimits, latBounds=yLimits, nx=50, ny=6,  
     40    var = makeLLVar(lonBounds=xLimits, latBounds=yLimits, nx=5000, ny=6000,  
    4141                    function=fnSinXAddCosY_10to10, missing_value=-999, 
    4242                    axisOrder='xy') 
  • qesdi/geoplot/trunk/lib/geoplot/tests/make_data_functions.py

    r5699 r5946  
    4949    yvals = N.linspace(0, yMax, shape[1]) 
    5050     
    51     for i in range(shape[0]): 
    52         for j in range(shape[1]): 
    53              
    54             x = xvals[i] 
    55             y = yvals[j] 
    56              
    57             data[i,j] = sin(x) + cos(y) 
     51    sinX = N.sin(xvals) 
     52    cosY = N.cos(yvals) 
     53     
     54    data = sinX + cosY 
     55#    for i in range(shape[0]): 
     56#        for j in range(shape[1]): 
     57#             
     58#            x = xvals[i] 
     59#            y = yvals[j] 
     60#             
     61#            data[i,j] = sin(x) + cos(y) 
    5862    data = data * 5 
    5963    data = data.round(0) 
  • qesdi/geoplot/trunk/lib/geoplot/tests/unit/test_colour_bar.py

    r5710 r5946  
    2222from geoplot.plot_font import PlotFont 
    2323from geoplot.colour_bar import ColourBar 
     24import geoplot.colour_scheme  
    2425 
    2526import geoplot.tests.test_config as testConfig 
     
    3940        self.colourBarRange = (25.0, 75.0) 
    4041        self.cb = ColourBar(colourBarLabel=self.colourBarLabel,  
    41                             colourBarPosition=self.colourBarPosition,  
    42                             colourBarMin=self.colourBarRange[0], 
    43                             colourBarMax=self.colourBarRange[1]) 
     42                            colourBarPosition=self.colourBarPosition) 
    4443 
    4544        self.sm = matplotlib.cm.ScalarMappable(cmap=matplotlib.cm.prism) 
     
    4948        geoplot.colour_bar.config = self.oldConfig 
    5049 
    51     def test_001_checkInitialisaion(self): 
     50    def test_001_drawContinuousColourBar(self): 
     51         
     52        cb = ColourBar('label', 'horizontal', 'continuous') 
     53         
     54        mockAxes = Mock(spec=matplotlib.axes.Axes) 
     55        scheme = Mock(spec=geoplot.colour_scheme.ContinuousColourScheme) 
     56         
     57        cb.draw(mockAxes, scheme) 
     58         
     59         
     60         
     61 
     62    def te_st_001_checkInitialisaion(self): 
    5263        assert(self.cb.colourBarLabel == self.colourBarLabel) 
    5364        assert(self.cb.colourBarPosition == self.colourBarPosition) 
     
    5566        assert(self.cb.colourBarMax == self.colourBarRange[1]) 
    5667 
    57     def test_002_checkLabelFont(self): 
     68    def te_st_002_checkLabelFont(self): 
    5869        colourBarFont = config[FONTS_SECTION]['ColourBarLabel'] 
    5970        assert(self.cb.labelFont.getDict('small')  == colourBarFont.getDict('small')) 
     
    6172        assert(self.cb.labelFont.getDict('large')  == colourBarFont.getDict('large')) 
    6273 
    63     def test_003_getNormalize(self): 
     74    def te_st_003_getNormalize(self): 
    6475        #check returns limits when no data provided 
    6576        norm = self.cb.getNormalize() 
     
    128139 
    129140    #position ticks (if 
    130     def test_012_repositionsTicksToDiscreteCmapBounds(self): 
     141    def te_st_012_repositionsTicksToDiscreteCmapBounds(self): 
    131142        #create a 6 element discreet colour map 
    132143        cmap = geoplot.utils.generateDiscreteCmap( 
  • qesdi/geoplot/trunk/lib/geoplot/tests/unit/test_colour_scheme_builder.py

    r5876 r5946  
    9292        nt.assert_equal(mockContBuilder.call_count, 1) 
    9393        nt.assert_equal(mockIntBuilder.call_count, 0) 
    94         nt.assert_equals(mockContBuilder.call_args, ((Range(10, 100), self.builder.cmap, ),{})) 
     94        nt.assert_equals(mockContBuilder.call_args, ((Range(10, 100), self.builder.colourBarScale, self.builder.cmap, ),{})) 
    9595 
    9696        # check the build command was called on the object returned from the class 
     
    112112        nt.assert_equal(mockIntBuilder.call_count, 1) 
    113113        nt.assert_equal(mockContBuilder.call_count, 0) 
    114         nt.assert_equals(mockIntBuilder.call_args, ((Range(10, 100), self.builder.cmap, self.builder.intervals, self.builder.intervalNames ),{})) 
     114        nt.assert_equals(mockIntBuilder.call_args, ((Range(10, 100), self.builder.colourBarScale, self.builder.cmap, self.builder.intervals, self.builder.intervalNames ),{})) 
    115115 
    116116        # check the build command was called on the object returned 
     
    150150     
    151151    def setUp(self): 
    152         self.builder = _ConinuousSchemeBuilder(Range(10, 100),  
     152        self.builder = _ConinuousSchemeBuilder(Range(10, 100), 'linear' , 
    153153                                               Mock(spec=matplotlib.colors.LinearSegmentedColormap)) 
    154154        self.mockGrid = Mock(spec=Grid) 
     
    186186            nt.assert_equal((scheme.norm.vmin, scheme.norm.vmax), (v_min, v_max))                    
    187187         
    188  
     188    def test_004_returnsLogNorm(self): 
     189        self.builder.cbScale = 'log' 
     190        scheme = self.builder.buildScheme(self.mockGrid) 
     191 
     192        nt.assert_true(isinstance(scheme.norm, matplotlib.colors.LogNorm)) 
     193         
    189194class Test_IntervalSchemeBuidler(object): 
    190195     
     
    192197        self.oldMax = geoplot.colour_scheme.MAX_INTERVALS 
    193198        geoplot.colour_scheme.MAX_INTERVALS = 20 
    194         self.builder = _IntervalSchemeBuidler(Range(10.0, 100.0),  
     199        self.builder = _IntervalSchemeBuidler(Range(10.0, 100.0),  'linear' , 
    195200                                              Mock(spec=matplotlib.colors.LinearSegmentedColormap),  
    196201                                              "20,30,40,50,60",  
Note: See TracChangeset for help on using the changeset viewer.