source: qesdi/graphplotter/trunk/graphplotter/lib/plot_builder.py @ 6330

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/graphplotter/trunk/graphplotter/lib/plot_builder.py@6330
Revision 6330, 2.6 KB checked in by pnorton, 12 years ago (diff)

Started to implement multiple line selection.

Line 
1'''
2Created on 14 Jan 2010
3
4@author: pnorton
5'''
6
7from linplot import Plot
8import cdms2 as cdms
9
10from graphplotter.lib.data_reader import DataReader
11
12import logging
13
14log = logging.getLogger(__name__)
15
16class PlotBuilder(object):
17    '''
18    Builds a plot using the linplot library
19    '''
20
21
22    def __init__(self, params, config):
23        '''
24        Constructor
25        '''
26        self.params = params
27        self.config = config
28   
29    def buildPlot(self):
30       
31        selections = self._buildSelections()
32       
33        log.debug("selections = %s" % (selections,))
34       
35        reader = DataReader(self.config['path'], self.config['axisLookup'])
36       
37        plt = Plot()
38       
39        plt.setYLabel(self.params['variable'])
40        plt.setXLabel(self.params['axis'])
41       
42        s = set(selections[0].items())
43       
44        for sel in selections[1:]:
45            s = s.intersection(sel.items())
46           
47        commonItems = dict(s)
48       
49        title = self.params['variable']+ ' vs ' + self.params['axis']
50       
51        if len(commonItems) > 1: 
52            title += ' with ' + self._getLineName(commonItems)
53           
54        plt.setTitle(title)
55       
56        log.debug("commonItems = %s" % (commonItems,))
57       
58        for sel in selections:
59            xdata, ydata = reader.getData(self.params['variable'], 
60                                          self.params['axis'], sel)
61       
62           
63            lineName = self._getLineName(sel, commonItems)
64           
65            plt.draw(xdata, ydata, label=lineName)
66       
67        return plt.getImage()
68   
69    def _buildSelections(self):
70       
71        selections = []
72        i = 0
73        selFound = True
74       
75        while(selFound):
76       
77            prefix = 's_%02i_' % (i,)
78       
79            sel = self._getSelection(prefix)
80           
81            selFound = sel is not None
82            if selFound:
83                selections.append(sel)
84            i += 1
85       
86        return selections
87   
88    def _getSelection(self, prefix):
89        sel = {}
90       
91        for k, v in self.params.items():
92            if k.find(prefix) == 0:
93                sel[k[len(prefix):]] = v
94       
95        if len(sel) == 0:
96            sel = None
97       
98        return sel
99   
100    def _getLineName(self, selection, commonItems={}):
101       
102        name = ""
103       
104        for k in sorted(selection.keys()):
105           
106            if k in commonItems:
107                continue
108           
109            name = name + "%s=%s, " % (k, selection[k])
110       
111        name = name[:-2]
112        return name
Note: See TracBrowser for help on using the repository browser.