Changeset 6318


Ignore:
Timestamp:
18/01/10 11:26:36 (10 years ago)
Author:
pnorton
Message:

Added the X axis index labels that allow string labels to be plotted against data.

Location:
qesdi/linplot/trunk
Files:
1 added
3 edited

Legend:

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

    r6314 r6318  
    77import logging 
    88import matplotlib 
     9import numpy 
    910from linplot import utils  
    1011from linplot.range import Range 
     
    1516#LEGEND_POSITION = [0.82, 0.15, 0.15, 0.7] 
    1617 
    17 AXIS_POSITION = [0.1, 0.2, 0.8, 0.7] 
     18AXIS_POSITION = [0.1, 0.25, 0.8, 0.65] 
    1819LEGEND_POSITION = [0.1, 0.05, 0.8, 0.1] 
    1920 
     
    3334        self._ax = self._makeAxes() 
    3435        self._legendAx = self._makeLegendAxes() 
     36        self._xIndexLabels = None 
    3537     
    36     def draw(self, yData, xData, **kwargs): 
     38    def draw(self, xdata, ydata, **kwargs): 
    3739         
    3840        kwargs.setdefault('label', 'Line #%s' % (len(self._ax.lines))) 
    3941         
    40         self._ax.add_line(matplotlib.lines.Line2D(yData, xData, **kwargs)) 
    41           
     42        log.debug("type(xdata[0]) = %s" % (type(xdata[0]),)) 
     43        log.debug("utils.isString(xdata[0]) = %s" % (utils.isString(xdata[0]),)) 
     44         
     45        if utils.isString(xdata[0]): 
     46            self._plotIndexXAxis(xdata, ydata, kwargs) 
     47        else: 
     48            self._plotNumericXAxis(xdata, ydata, kwargs) 
     49     
     50    def addXAxisIndexValues(self, indexLabels): 
     51        """ 
     52        Sets the index values for the x axis, these will be used when string 
     53        values are passed as xdata 
     54        """  
     55        self._setXIndexLabels(indexLabels) 
     56         
     57     
     58    def _plotIndexXAxis(self, xdata, ydata, kwargs): 
     59        self._setXIndexLabels(xdata) 
     60 
     61        #work out what the xdata is for this axis 
     62        xIndex = [self._xIndexLabels.index(d) for d in xdata] 
     63         
     64        self._ax.add_line(matplotlib.lines.Line2D(xIndex, ydata, **kwargs)) 
     65     
     66    def _setXIndexLabels(self, newLabels): 
     67         
     68        if self._xIndexLabels is None: 
     69            self._xIndexLabels = [d for d in newLabels] 
     70        else: 
     71            for d in newLabels: 
     72                if d not in self._xIndexLabels: 
     73                    self._xIndexLabels.append(d) 
     74         
     75        log.debug("self._xIndexLabels = %s" % (self._xIndexLabels,)) 
     76                     
     77        # (re) set the x axis labels  
     78        locations = numpy.arange(len(self._xIndexLabels)) 
     79        loc = matplotlib.ticker.FixedLocator(locations) 
     80        self._ax.get_xaxis().set_major_locator(loc) 
     81         
     82        self._ax.set_xticklabels(self._xIndexLabels)         
     83         
     84     
     85    def _plotNumericXAxis(self, xdata, ydata, kwargs): 
     86         
     87        if self._xIndexLabels is not None: 
     88            raise Exception("Can't mix index and non-index values in the x axis") 
     89         
     90        self._ax.add_line(matplotlib.lines.Line2D(xdata, ydata, **kwargs)) 
     91     
     92    def setXLabel(self, label): 
     93        self._ax.set_xlabel(label) 
     94     
     95    def setYLabel(self, label): 
     96        self._ax.set_ylabel(label) 
     97     
     98     
     99     
     100     
    42101    def saveImage(self, outputFile): 
    43102         
     
    81140        self._ax.plot([0,1], [0,0], "-", transform=trans, color="0.6", linewidth=1, zorder=-1) 
    82141         
     142        log.debug("ylim = %s" % (ylim,)) 
     143         
    83144        # reset the limits to avoid including the value from the line above 
    84145        self._ax.set_xlim(xlim); self._ax.set_ylim(ylim) 
    85          
    86         log.debug("self._ax.get_xlim() = %s" % (self._ax.get_xlim(),)) 
    87         log.debug("self._ax.get_ylim() = %s" % (self._ax.get_ylim(),)) 
    88          
     146                 
    89147        if not self._xRange is None: 
    90148            self._ax.set_xlim(float(self._xRange.minimum), float(self._xRange.maximum)) 
    91149         
    92  
    93150        if not self._yRange is None: 
    94151            self._ax.set_ylim(float(self._yRange.minimum), float(self._yRange.maximum))         
  • qesdi/linplot/trunk/src/linplot/utils.py

    r6161 r6318  
    1414 
    1515from linplot.image_import import Image 
     16import numpy 
    1617 
    1718log = logging.getLogger(__name__) 
     
    2930     
    3031    return im 
     32 
     33def isString(x): 
     34     
     35    if type(x) in [str, numpy.string_]: 
     36        return True 
     37    return False 
  • qesdi/linplot/trunk/tests/linplot_tests/draw/draw_data.py

    r6314 r6318  
    1717    outputFile = os.path.join(outputDir, fileName) 
    1818         
    19     ydata = numpy.array([230.0, 330.0, 450.0, 600.0]) 
     19    ydata = numpy.array([325.0, 325.0, 325.0, 325.0]) 
    2020    xdata = numpy.array([1990.0, 2000.0, 2020.0, 2040.0]) 
    2121     
    2222    plt = Plot() 
    2323    plt.draw(xdata, ydata) 
     24     
     25    plt.setXLabel('X - year') 
     26    plt.setYLabel('Y - temp') 
    2427         
    2528    plt.saveImage(outputFile) 
Note: See TracChangeset for help on using the changeset viewer.