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')