Changeset 6446


Ignore:
Timestamp:
01/02/10 13:11:23 (9 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.

Location:
qesdi/linplot/trunk
Files:
7 added
5 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): 
  • qesdi/linplot/trunk/src/linplot/utils.py

    r6318 r6446  
    1212 
    1313from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
     14from matplotlib.backends.backend_agg import RendererAgg as Renderer 
    1415 
    1516from linplot.image_import import Image 
  • qesdi/linplot/trunk/tests/linplot_tests/draw/draw_data.py

    r6318 r6446  
    1111from linplot_tests.draw import getDrawOutputDir, SHORT_LOG_FORMAT_STRING 
    1212 
    13 def draw_data(): 
     13def draw_data(s=None): 
    1414     
    1515    fileName = 'data.png' 
     
    2929    print "Wrote %s" % (outputFile) 
    3030     
    31  
    3231if __name__ == '__main__': 
    3332     
  • qesdi/linplot/trunk/tests/linplot_tests/draw/draw_named_index.py

    r6318 r6446  
    1111from linplot_tests.draw import getDrawOutputDir, SHORT_LOG_FORMAT_STRING 
    1212 
    13 def draw_named_index(): 
     13from common import getData, seed 
     14import random 
     15log = logging.getLogger(__name__) 
     16 
     17def draw_named_index_short(): 
    1418     
    15     fileName = 'named_index.png' 
     19    fileName = 'named_index_short.png' 
    1620    outputDir = getDrawOutputDir() 
    1721    outputFile = os.path.join(outputDir, fileName) 
     
    4751    print "Wrote %s" % (outputFile) 
    4852     
     53def draw_named_index_long(): 
     54     
     55     
     56    fileName = 'named_index_long.png' 
     57    outputDir = getDrawOutputDir() 
     58    outputFile = os.path.join(outputDir, fileName) 
     59     
     60    l = [ "scheme with long name %s" % (x,) for x in ['A','B','C','D','E','F' ]] 
     61     
     62    plt = Plot() 
     63    nlines = 3 
     64     
     65    # set the order of the labels to be used 
     66    plt.addXAxisIndexValues(l) 
     67 
     68    for i in range(nlines): 
     69        nItems = random.randint(2, len(l)) 
     70         
     71        xdata = numpy.array(random.sample(l, nItems)) 
     72        xdata.sort() 
     73        ydata = getData(len(xdata)) 
     74        label="model number %s" % (i,) 
     75        log.debug("label= %s, xdata = %s, ydata = %s" % (label, xdata, ydata,)) 
     76        plt.draw(xdata, ydata, label=label) 
     77         
     78    plt.setXLabel('X - year') 
     79    plt.setYLabel('Y - temp') 
     80         
     81    plt.saveImage(outputFile) 
     82    print "Wrote %s" % (outputFile) 
     83 
     84def draw_named_index(s=None): 
     85    seed(s) 
     86    draw_named_index_short() 
     87    draw_named_index_long() 
    4988 
    5089if __name__ == '__main__': 
    5190     
     91     
    5292    logging.basicConfig(level=logging.DEBUG, format=SHORT_LOG_FORMAT_STRING) 
    5393    draw_named_index() 
  • qesdi/linplot/trunk/tests/linplot_tests/draw/draw_trig_functions.py

    r6161 r6446  
    1111from linplot_tests.draw import getDrawOutputDir, SHORT_LOG_FORMAT_STRING 
    1212 
    13 def draw_trig_functions(): 
     13def draw_trig_functions(s=None): 
    1414     
    1515    fileName = 'trig_functions.png' 
Note: See TracChangeset for help on using the changeset viewer.