Changeset 6329 for qesdi


Ignore:
Timestamp:
18/01/10 16:15:42 (10 years ago)
Author:
pnorton
Message:

Changed how linplot sets up the legend, it now tries to resize the axis to fit in additional legend items.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • qesdi/linplot/trunk/src/linplot/plot.py

    r6318 r6329  
    88import matplotlib 
    99import numpy 
     10import math 
    1011from linplot import utils  
    1112from linplot.range import Range 
     
    1314log = logging.getLogger(__name__) 
    1415 
     16 
     17 
    1518#AXIS_POSITION = [0.1, 0.15, 0.7, 0.7] 
    1619#LEGEND_POSITION = [0.82, 0.15, 0.15, 0.7] 
    1720 
    18 AXIS_POSITION = [0.1, 0.25, 0.8, 0.65] 
    19 LEGEND_POSITION = [0.1, 0.05, 0.8, 0.1] 
    20  
    21 #AXIS_POSITION = [0.1, 0.35, 0.8, 0.6] 
    22 #LEGEND_POSITION = [0.1, 0.05, 0.8, 0.225] 
     21# one row 
     22BASE_AXIS_POSITION =  [0.1, 0.20, 0.8, 0.7] 
     23BASE_LEGEND_POSITION = [0.1, 0.05, 0.8, 0.05] 
     24 
     25# two rows 
     26#AXIS_POSITION = [0.1, 0.25, 0.8, 0.65] 
     27#LEGEND_POSITION = [0.1, 0.05, 0.8, 0.1] 
     28 
     29##three rows 
     30#AXIS_POSITION = [0.1, 0.30, 0.8, 0.6] 
     31#LEGEND_POSITION = [0.1, 0.05, 0.8, 0.15] 
     32 
     33COLORS = ['red', 'blue', 'yellow', 'green', 'orange', 'purple', 'cyan', 'black', 'brown', 'pink', 'grey', 'lightblue', 'darkblue', 'lightgreen', 'darkgreen'] 
    2334 
    2435class Plot(object): 
     
    3849    def draw(self, xdata, ydata, **kwargs): 
    3950         
    40         kwargs.setdefault('label', 'Line #%s' % (len(self._ax.lines))) 
    41          
    42         log.debug("type(xdata[0]) = %s" % (type(xdata[0]),)) 
    43         log.debug("utils.isString(xdata[0]) = %s" % (utils.isString(xdata[0]),)) 
    44          
     51        nlines = len(self._ax.lines) 
     52        kwargs.setdefault('label', 'Line #%s' % (nlines,)) 
     53        kwargs.setdefault('color', COLORS[nlines % len(COLORS)]) 
     54                 
    4555        if utils.isString(xdata[0]): 
    4656            self._plotIndexXAxis(xdata, ydata, kwargs) 
     
    95105    def setYLabel(self, label): 
    96106        self._ax.set_ylabel(label) 
    97      
    98      
    99      
    100      
     107         
    101108    def saveImage(self, outputFile): 
    102109         
     
    123130         
    124131    def _makeAxes(self): 
    125         return self._fig.add_axes(AXIS_POSITION,  frameon=True) 
     132        return self._fig.add_axes(BASE_AXIS_POSITION,  frameon=True) 
    126133     
    127134    def _makeLegendAxes(self): 
    128         return self._fig.add_axes(LEGEND_POSITION, xticks=[], yticks=[], frameon=False) 
     135        return self._fig.add_axes(BASE_LEGEND_POSITION, xticks=[], yticks=[], frameon=False) 
    129136     
    130137    def _scaleAxes(self): 
     
    159166 
    160167        ncol = len(handles) if len(handles) < 3 else 3 
     168        maxLabelLen = max([len(x) for x in labels]) 
     169        log.debug("labels = %s" % (labels,)) 
     170        log.debug("maxLabelLen = %s" % (maxLabelLen,)) 
     171         
     172        if maxLabelLen > 15 and ncol > 2: 
     173            ncol = 2 
     174         
     175        if maxLabelLen > 30 and ncol > 1: 
     176            ncol = 1 
     177         
    161178        log.debug("ncol = %s" % (ncol,)) 
    162  
     179         
    163180        leg = self._legendAx.legend(handles, labels, ncol=ncol, 
    164181                                    loc=2, mode='expand', borderaxespad=0) 
    165          
     182 
     183        nlines = len(self._ax.lines) - 1 
     184        nrow = math.ceil(float(nlines)/ncol) 
     185 
     186        axisPos, legPos = self.getAxisPositions(nrow) 
     187 
     188        self._ax.set_position(axisPos) 
     189        self._legendAx.set_position(legPos) 
     190 
    166191        vp = leg._legend_box._children[-1]._children[0]  
    167192        log.debug("vp = %s" % (vp,)) 
    168          
     193 
    169194        return leg 
    170195     
     196     
     197    def getAxisPositions(self, nrow): 
     198 
     199        rowHeight = 0.05 
     200        shift = rowHeight * (nrow - 1) 
     201         
     202        axisPos = [0.0] * 4  
     203        axisPos[0] = BASE_AXIS_POSITION[0] 
     204        axisPos[1] = BASE_AXIS_POSITION[1] + shift 
     205        axisPos[2] = BASE_AXIS_POSITION[2] 
     206        axisPos[3] = BASE_AXIS_POSITION[3] - shift 
     207         
     208        legPos = [0.0] * 4 
     209        legPos[0] = BASE_LEGEND_POSITION[0] 
     210        legPos[1] = BASE_LEGEND_POSITION[1] 
     211        legPos[2] = BASE_LEGEND_POSITION[2] 
     212        legPos[3] = BASE_LEGEND_POSITION[3] + shift 
     213         
     214        return axisPos, legPos  
     215         
     216 
    171217    def setXRange(self, minVal, maxVal=None): 
    172218        self._xRange = self._buildRange(minVal, maxVal) 
    173          
     219 
    174220    def setYRange(self, minVal, maxVal=None): 
    175221        self._yRange = self._buildRange(minVal, maxVal) 
    176      
     222 
     223    def setTitle(self, title): 
     224        self._ax.set_title(title) 
     225 
    177226    def _buildRange(self, minVal, maxVal): 
    178227        if minVal is None: 
    179228            return None 
    180         else:         
    181             return Range(minVal, maxVal)         
    182          
    183          
     229        else: 
     230            return Range(minVal, maxVal) 
     231         
Note: See TracChangeset for help on using the changeset viewer.