Exemplo n.º 1
0
 def __init__(self,data,imagefileurl,name,label,title,nbpts=None,ptindexlist=None,timerange=False,timestart=None,type='ggl',labelx='',labely=None,unitx='',unity=''):
     Log('MyXYChart: begin %s\n' % label)
     self.charttype='line'
     self.imagefileurl = imagefileurl
     self.name = name
     self.label = label
     self.title = title
     self.type = type
     # Simple chart or XY chart ?
     if len(data)==2 and len(data[0])>1:
         datax = data[0]
         datay = data[1]
     else:
         #print('DEBUG: simple chart')
         datay = data
     # Compute min and max Y values
     (min_y,max_y,scaling_y) = ExtendRange(min(datay),max(datay))
     if max_y-min_y==0:
         max_y = min_y + 1.0
         scaling_y = 0.2
     
     if type in ('dyg','json'):
         self.marginsize = 0
         self.pt2px = None
         self.data = list(data)
         self.timerange = timerange
         self.labelx = labelx
         self.unitx = unitx
         self.unity = unity
         if labely==None:
             self.labely = label
         else:
             self.labely = labely
         if timerange:
             self.data[0] = map(lambda secf: 1000*time.mktime((timestart + datetime.timedelta(seconds=int(secf))).timetuple()),data[0])
             #self.data[0] = map(int,data[0])
         return
     
     #print('min_y=%d max_y=%d scaling_y=%d' % (min_y,max_y,scaling_y))
     #max_y = int(ceil(max(datay))) # up rounded max value
     #if min(datay)<0.0:
     #    min_y = int(floor(min(datay)))
     #else:
     #    min_y = 0
     #print('min_y=%d,max_y=%d %f' % (min_y,max_y,max(datay)))
     #self.marginsize = max(len(str(max_y)),len(str(min_y)))*6+6  # Font size of y label is 6 pixels
     #self.marginsize = 30
     self.marginsize = max(max(len(str(max_y)),len(str(min_y)))*7+10,30)  # Font size of y label is 6 pixels
     self.height = 200
     # Build chart
     if len(data)==2 and len(data[0])>1:
         self.width = 800
         (min_x,max_x,scaling_x) = ExtendRange(datax[0],datax[len(datax)-1])
         #print('min_x=%d max_x=%d' % (min_x,max_x))
         min_x = int(floor(datax[0]))
         max_x = int(ceil(datax[len(datax)-1]))
         #print('min_x=%d max_x=%d' % (min_x,max_x))
         chart = XYLineChart(self.width, self.height, x_range=[min_x,max_x], y_range=[min_y,max_y])
         chart.add_data(datax)
         chart.add_data(datay)
         if min_y<0 and max_y>0:
             chart.add_data([0,max_x])
             chart.add_data([0,0])
             chart.set_colours(['339900','FF0000'])
             chart.grid = '%s,%s,%s,%s,%s,%s' % (float(scaling_x*100)/float(max_x-min_x),float(scaling_y*100)/float(max_y-min_y),2,2,float(min_x*100)/float(max_x-min_x),0.0)
         else:
             chart.set_colours(['339900'])
             try:
                 chart.grid = '%s,%s,%s,%s,%s,%s' % (float(scaling_x*100)/float(max_x-min_x),float(scaling_y*100)/float(max_y-min_y),2,2,float(min_x*100)/float(max_x-min_x),float(min_y*100)/float(max_y-min_y))
             except ZeroDivisionError:
                 print 'DEBUG: %s %s %s %s' % (max_x,min_x,max_y,min_y)
         #print('grid=%s' % chart.grid)
         #chart.set_grid ...
         if timerange:
             axis_index = chart.set_axis_labels(Axis.BOTTOM, map(lambda sec: SecondToTimeString(timestart,sec),MyRange(min_x,max_x,scaling_x)))
             chart.set_axis_positions(axis_index, map(lambda x: '%.4f' % (float(x*100)/float(max_x-min_x)),MyRange(min_x,max_x,scaling_x)))  #.4f to no have too long urls
             #for x in MyRange(scaling_x,max_x,scaling_x):
             #    chart.add_marker(0,GetIndexOfClosest(datax,x),'V','AAAAAA',1,-1)
         else:
             axis_index = chart.set_axis_labels(Axis.BOTTOM, MyRange(min_x,max_x,scaling_x))
             chart.set_axis_positions(axis_index, map(lambda x: '%.4f' % (float(x*100)/float(max_x-min_x)),MyRange(min_x,max_x,scaling_x)))  #.4f to no have too long urls
             #for x in MyRange(scaling_x,max_x,scaling_x):
             #    chart.add_marker(0,GetIndexOfClosest(datax,x),'V','AAAAAA',1,-1)
         chart.set_axis_labels(Axis.LEFT, MyRange(min_y,max_y,scaling_y))
         marginright = 30
         graphsize = self.width-self.marginsize-marginright
         #print([GetIndexOfCloserFromOrderedList(i,ptindexlist) for i in range(0,nbpts)])
         if ptindexlist==None:
             #if nbpts==None:
             #    nbpts=len(datax)
             if not(nbpts==len(datax)):
                 raise Exception('nbpts=%s len(datax)=%s'%(nbpts,len(datax)))
             self.pt2px = [int(round(datax[i]*graphsize/(max(datax)-min(datax)))) for i in range(0,nbpts)]
         else:
             dataxrange = max(datax)-min(datax)
             maxj = len(ptindexlist)-1
             self.pt2px = []
             j = 0
             for i in range(0,nbpts):
                 if j<maxj and ptindexlist[j+1]<=i:
                     j += 1
                 self.pt2px.append(int(round(datax[j]*graphsize/dataxrange)))
             #self.pt2px = [int(round(datax[GetIndexOfClosestFromOrderedList(i,ptindexlist)]*graphsize/(max(datax)-min(datax)))) for i in range(0,nbpts)]
         # the following works only if points are equally
         #self.pt2px = [int(round(datax[min(int(round(i*len(datax)/nbpts)),len(datax)-1)]*graphsize/(max(datax)-min(datax)))) for i in range(0,nbpts)]
     else:
         self.pt2px = None
         self.width = len(datay) + self.marginsize
         chart = SimpleLineChart(self.width, self.height, y_range=[min_y,max_y])
         chart.add_data(data)
         chart.set_colours(['0000FF'])
         #print('here %d %d'%(min_y,max_y))
         #sys.exit()
         chart.set_axis_labels(Axis.LEFT, MyRange(min_y,max_y,scaling_y))
         marginright = 0
     chart.markers.append(('B','FFEE0080','0','1.0','0'))
     #chart.add_fill_simple('FFCC00')
     # Set the vertical stripes
     #chart.fill_linear_stripes(Chart.CHART, 0, 'CCCCCC', 0.2, 'FFFFFF', 0.2)
     # Set label
     #chart.set_title(label)
     # Build googlecharts url
     #print '&chma='+str(self.marginsize-2)+','+str(marginright)+',0,0'
     self.imagefileurl = chart.get_url() + '&chma='+str(self.marginsize-2)+','+str(marginright)+',0,0'
     if len(self.imagefileurl)>2069:
         raise ValueError('Too much values (%d) instead of 2069' % (len(self.imagefileurl)))
     Log('MyXYChart: end\n')