[jToolkit-cvs] jToolkit/widgets chart.py,1.25,1.26
Brought to you by:
davidfraser,
friedelwolff
From: <dav...@us...> - 2004-03-10 07:39:11
|
Update of /cvsroot/jtoolkit/jToolkit/widgets In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20875 Modified Files: chart.py Log Message: Refactored LineChart into a line chart and a subclass which formats dates. The date line chart displays ten time labels uniformly spaced along the graph. Partial sets of data are now displayed correctly (although not null sets yet) Index: chart.py =================================================================== RCS file: /cvsroot/jtoolkit/jToolkit/widgets/chart.py,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** chart.py 8 Mar 2004 16:48:13 -0000 1.25 --- chart.py 10 Mar 2004 07:13:30 -0000 1.26 *************** *** 97,107 **** return img class LineChart(Chart): ! def __init__(self, charttable, xcolumn, ycolumns, xstorageformat='TEXT', xdisplay='', filter=None,xdisplay2=None): self.xcolumn = xcolumn self.ycolumns = ycolumns ! self.xstorageformat = xstorageformat ! self.xdisplay = xdisplay ! self.xdisplay2 = xdisplay2 Chart.__init__(self, charttable, filter) --- 97,107 ---- return img + #This class now assumes a text storage format for x values. See below for subclass which handles dates class LineChart(Chart): ! def __init__(self, charttable, xcolumn, ycolumns, startVal=None, endVal=None, filter=None): self.xcolumn = xcolumn self.ycolumns = ycolumns ! self.startVal = startVal ! self.endVal = endVal Chart.__init__(self, charttable, filter) *************** *** 114,129 **** def getdata(self): chartdata = self.charttable.gettablerows(self.filter) ! if self.xstorageformat == 'DATETIME': ! if self.xdisplay2: ! self.xdata = [dates.formatdate(chartdata[0][self.xcolumn], self.xdisplay)] ! self.xdata += [dates.formatdate(row[self.xcolumn],self.xdisplay2) for row in chartdata[1:-1]] ! self.xdata += [dates.formatdate(chartdata[-1][self.xcolumn], self.xdisplay)] ! else: ! self.xdata = [dates.formatdate(row[self.xcolumn],self.xdisplay) for row in chartdata] ! else: ! self.xdata = [str(row[self.xcolumn]) for row in chartdata] self.ydata = [[self.mapfromNone(row[ycolumn]) for row in chartdata] for ycolumn in self.ycolumns] self.legendlabels = [str(ycolumn) for ycolumn in self.ycolumns] def drawimage(self): #For now, x axis will be evenly spaced --- 114,128 ---- def getdata(self): chartdata = self.charttable.gettablerows(self.filter) ! self.xdata = [str(row[self.xcolumn]) for row in chartdata] self.ydata = [[self.mapfromNone(row[ycolumn]) for row in chartdata] for ycolumn in self.ycolumns] self.legendlabels = [str(ycolumn) for ycolumn in self.ycolumns] + #x axis tick labels should be uniformly distributed in this case + if self.startVal == None: + self.startVal = 0 + if self.endVal == None: + self.endVal = len(self.xdata) + self.xticks = self.xvalues = arange(self.startVal, self.endVal, float(self.endVal - self.startVal)/len(self.xdata)) + def drawimage(self): #For now, x axis will be evenly spaced *************** *** 144,181 **** ymax = value - self.figure.get_current_axis().set_xlim([0,len(self.xdata)+1]) self.figure.get_current_axis().set_ylim([math.floor(ymin),math.ceil(ymax)]) ! #Calculate number of x labels to use - between 6 and 10 ! #First see if anything divides nicely ! xDataLen = len(self.xdata) ! numLabels = None ! for testnum in range(5,10): ! if xDataLen % testnum == 0: ! numLabels = testnum+1 ! ! #Otherwise go for max ! if not numLabels: numLabels = 10 ! ! sliceNum = xDataLen / (numLabels-1) ! if not sliceNum: sliceNum = 1 ! ! currentxdata = self.xdata[:1] ! currentxpos = sliceNum ! while currentxpos < xDataLen: ! currentxdata.append(self.xdata[currentxpos]) ! currentxpos += sliceNum ! currentxdata.extend(self.xdata[-1:]) ! #Set the x labels ! self.figure.get_current_axis().set_xticks(arange(xDataLen+1,step=sliceNum)) ! self.figure.get_current_axis().set_xticklabels(currentxdata,rotation='vertical') #Plot each dataset for dataset in self.ydata: ! self.figure.get_current_axis().plot(dataset) #Draw a legend self.figure.get_current_axis().legend(self.legendlabels,2) class CurrentValueLegendChart(Chart): """This class creates a bar chart which acts as a legend and a current value reporter""" --- 143,189 ---- ymax = value self.figure.get_current_axis().set_ylim([math.floor(ymin),math.ceil(ymax)]) ! self.figure.get_current_axis().set_xticks(self.xticks) ! self.figure.get_current_axis().set_xticklabels(self.xdata,rotation='vertical') #Plot each dataset for dataset in self.ydata: ! self.figure.get_current_axis().plot(self.xvalues,dataset) ! ! self.figure.get_current_axis().set_xlim([self.startVal, self.endVal]) #Draw a legend self.figure.get_current_axis().legend(self.legendlabels,2) + NUM_TIME_LABELS = 10 + + class DateLineChart(LineChart): + def __init__(self, charttable, xcolumn, ycolumns, xdisplay, startDate=None, endDate=None, filter=None): + self.xdisplay = xdisplay + self.startDate = startDate + self.endDate = endDate + self.startDateVal = dates.mktime(startDate) + LineChart.__init__(self, charttable, xcolumn, ycolumns, 0, dates.mktime(endDate) - self.startDateVal, filter) + + def getdata(self): + chartdata = self.charttable.gettablerows(self.filter) + self.ydata = [[self.mapfromNone(row[ycolumn]) for row in chartdata] for ycolumn in self.ycolumns] + self.legendlabels = [str(ycolumn) for ycolumn in self.ycolumns] + self.xvalues = [dates.mktime(dates.WinPyTimeToDate(row[self.xcolumn])) - self.startDateVal for row in chartdata] + + if self.startDate == None: + self.startDate = dates.WinPyTimeToDate(chartdata[0][self.xcolumn]) + if self.endDate == None: + self.endDate = dates.WinPyTimeToDate(chartdata[-1][self.xcolumn]) + timeStep = (self.endDate - self.startDate) / NUM_TIME_LABELS + + self.xdata = [] + self.xticks = [] + for i in range(NUM_TIME_LABELS+1): + labelDate = self.startDate+(timeStep*i) + self.xdata.append(dates.formatdate(labelDate,self.xdisplay)) + self.xticks.append(dates.mktime(labelDate) - self.startDateVal) + class CurrentValueLegendChart(Chart): """This class creates a bar chart which acts as a legend and a current value reporter""" |