Ignore:
Timestamp:
01/02/10 13:11:23 (11 years ago)
Author:
pnorton
Message:

Made several changes to try and improve the layout of the plot. Also introduced rotating axis labels to avoid labels being drawn on top of each other.

File:
1 edited

Legend:

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

    r6329 r6446  
    1212from linplot.range import Range 
    1313 
     14from linplot.config import config 
     15 
     16from linplot.layout_manager import LayoutManager, BASE_AXIS_POSITION, BASE_LEGEND_POSITION 
     17 
    1418log = logging.getLogger(__name__) 
    15  
    16  
    17  
    18 #AXIS_POSITION = [0.1, 0.15, 0.7, 0.7] 
    19 #LEGEND_POSITION = [0.82, 0.15, 0.15, 0.7] 
    20  
    21 # one row 
    22 BASE_AXIS_POSITION =  [0.1, 0.20, 0.8, 0.7] 
    23 BASE_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] 
    3219 
    3320COLORS = ['red', 'blue', 'yellow', 'green', 'orange', 'purple', 'cyan', 'black', 'brown', 'pink', 'grey', 'lightblue', 'darkblue', 'lightgreen', 'darkgreen'] 
     
    3926        self.size = size 
    4027        self.dpi = dpi 
     28         
     29         
    4130         
    4231        self._xRange = None 
     
    5241        kwargs.setdefault('label', 'Line #%s' % (nlines,)) 
    5342        kwargs.setdefault('color', COLORS[nlines % len(COLORS)]) 
    54                  
     43        log.debug("kwargs = %s" % (kwargs,)) 
     44         
    5545        if utils.isString(xdata[0]): 
    5646            self._plotIndexXAxis(xdata, ydata, kwargs) 
     
    10797         
    10898    def saveImage(self, outputFile): 
    109          
    110         if len(self._ax.lines) == 0: 
    111             raise Exception("Trying to create a plot with no lines.") 
    112          
    113         self._scaleAxes() 
    114         self._populateLegend() 
    115         im = utils.figureToImage(self._fig) 
     99        im = self.getImage() 
    116100        im.save(outputFile) 
    117101     
     
    120104            raise Exception("Trying to create a plot with no lines.") 
    121105         
     106        lm = LayoutManager(utils.Renderer, self.dpi, self.size[0], self.size[1]) 
     107         
    122108        self._scaleAxes() 
    123         self._populateLegend() 
     109         
     110        self._populateLegend(lm) 
     111         
     112        lm.fitPlotInAxis(self._ax) 
     113         
    124114        im = utils.figureToImage(self._fig) 
    125115        return im 
     
    130120         
    131121    def _makeAxes(self): 
     122#         
     123#        a = self._fig.add_axes(BASE_AXIS_POSITION,  
     124#                     xticks=[], yticks=[], frameon=True)         
    132125        return self._fig.add_axes(BASE_AXIS_POSITION,  frameon=True) 
    133126     
    134127    def _makeLegendAxes(self): 
    135         return self._fig.add_axes(BASE_LEGEND_POSITION, xticks=[], yticks=[], frameon=False) 
     128         
     129#        a = self._fig.add_axes(BASE_LEGEND_POSITION,  
     130#                     xticks=[], yticks=[], frameon=True)         
     131#         
     132#        for loc, spine in a.spines.iteritems(): 
     133#            spine.set_edgecolor('b') 
     134             
     135        legAx = self._fig.add_axes(BASE_LEGEND_POSITION, xticks=[], yticks=[], frameon=False) 
     136         
     137        return legAx 
    136138     
    137139    def _scaleAxes(self): 
     
    158160            self._ax.set_ylim(float(self._yRange.minimum), float(self._yRange.maximum))         
    159161     
    160     def _populateLegend(self): 
    161          
    162         log.debug("self._ax.lines = %s" % (self._ax.lines,)) 
     162    def _populateLegend(self, lm): 
    163163         
    164164        handles, labels = self._ax.get_legend_handles_labels() 
    165         log.debug("len(handles) = %s" % (len(handles),)) 
    166165 
    167         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          
    178         log.debug("ncol = %s" % (ncol,)) 
     166        ncol = lm.calculateLegendNcol(labels) 
    179167         
    180168        leg = self._legendAx.legend(handles, labels, ncol=ncol, 
    181                                     loc=2, mode='expand', borderaxespad=0) 
     169                                    loc=8, mode='expand', borderaxespad=0) 
    182170 
    183         nlines = len(self._ax.lines) - 1 
    184         nrow = math.ceil(float(nlines)/ncol) 
     171        # set the legend text font 
    185172 
    186         axisPos, legPos = self.getAxisPositions(nrow) 
     173        legendFont = config['LegendFont'] 
     174        [ legendFont.setProperties(lt) for lt in leg.get_texts()] 
    187175 
    188         self._ax.set_position(axisPos) 
    189         self._legendAx.set_position(legPos) 
     176 
     177        lm.setAxisPositions(labels, ncol, leg, self._legendAx, self._ax) 
    190178 
    191179        vp = leg._legend_box._children[-1]._children[0]  
     
    193181 
    194182        return leg 
    195      
    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          
    216183 
    217184    def setXRange(self, minVal, maxVal=None): 
Note: See TracChangeset for help on using the changeset viewer.