def animalNum(stats): chart = XYLineChart(400, 300) max_wx = 0 for creature in ['rabbit', 'wolf']: WX = [] WY = [] count = 0 for t in sorted(stats[creature].keys()): WX.append(t) for event in stats[creature][t]['event']: if event == LiveLog.BIRTH: count += 1 else: count -= 1 # print count, creature, str(stats[creature][t]['event']) WY.append(count) chart.add_data(WX) chart.add_data(WY) max_wx = max(max_wx, max(WX)) chart.set_title("Population size") chart.set_colours(['ff0000', '0000ff']) chart.set_legend(['rabbits', 'wolves']) chart.set_grid(0, 10, 3, 3) chart.set_axis_labels(Axis.BOTTOM, range(0, max_wx + 1, 100)) chart.download('number.png')
def make_chart(request): chart = XYLineChart(640, 400) chart.set_colours(['FF0000', '00FF00', '0000FF']) # add a few attributes to build the legend incrementally chart.devices = [] chart._ranges = [] return chart
class Graph(): colours = [] legend = [] max_wx = 0 max_wy = 0 min_wy = 4000000000 label_suffix = " MB" scale = 1024*1024 def __init__(self): self.chart = XYLineChart(750, 400) def set_config(self, config): self.label_suffix = config.get("general", "label_suffix") self.scale = int(config.get("general", "scale")) def add_serie(self, WX, WY, colour, descr): self.chart.add_data(WX) self.chart.add_data(WY) self.colours.append(colour) self.legend.append(descr) self.max_wx = max(self.max_wx, max(WX)) self.max_wy = max(self.max_wy, max(WY)) self.min_wy = min(self.min_wy, min(WY)) def set_title(self, title): self.chart.set_title(title) def make_chart(self, name): densX = self.max_wx / 15 wy_max_lab = int(self.max_wy / self.scale + 1) wy_min_lab = int(max(self.min_wy / self.scale - 1, 0)) densY = max((wy_max_lab - wy_min_lab) / 10, 1) self.chart.set_axis_labels(Axis.BOTTOM, range(0, self.max_wx + 1, densX)) self.chart.set_axis_labels(Axis.LEFT, self.__make_Ylabels(wy_min_lab, wy_max_lab, int(densY))) self.chart.y_range = (wy_min_lab * self.scale, wy_max_lab * self.scale) self.chart.set_legend(self.legend) self.chart.set_colours(self.colours) self.chart.set_grid(15, 10, 1, 5) self.chart.download("%s.png" % (name)) def __make_Ylabels(self, wy_min_lab, wy_max_lab, densY): result = [] for i in range(wy_min_lab, wy_max_lab, densY): result.append("%d%s" % (i, self.label_suffix)) return result
def graph_evolution(gens, best_per_gen): chart = XYLineChart(500, 500, x_range=(0, max(gens)), y_range=(0, max(best_per_gen))) chart.add_data(gens) chart.add_data(best_per_gen) chart.set_colours(['0000FF']) # x axis labels are generation numbers chart.set_axis_labels(Axis.BOTTOM, gens) webbrowser.open(chart.get_url())
def make_graph(x_axis, data, color_vertically=True): x_axis = x_axis[:] data = data[:] max_y_value = 24500000 max_y = 24500000 min_time = min(x_axis) max_time = max(x_axis) chart = XYLineChart(700, 400, x_range=[min_time, max_time], y_range=[0, max_y_value]) chart.set_axis_labels(Axis.LEFT, ['', max_y_value]) start_time = datetime.fromtimestamp(min(x_axis)).strftime("%H:%M") end_time = datetime.fromtimestamp(max(x_axis)).strftime("%H:%M") chart.set_axis_labels(Axis.BOTTOM, [start_time, end_time]) # First value is the highest Y value. Two of them are needed to be # plottable. chart.add_data([min_time, max_time]) chart.add_data([max_y] * 2) #print max_y, min_time, max_time prev_y = [0] * 2 for bar in data[::-1]: Y = bar if not Y: Y = prev_y #print "X", idx, X #print "Y", idx, Y chart.add_data(x_axis) chart.add_data(Y) prev_y = Y chart.add_data([min_time, max_time]) chart.add_data([0] * 2) # Black lines chart.set_colours(['000000'] * 5) color_chart_vertically(chart, data) print chart.get_url() return chart
def genChart(width, height, data, ind, outfile, title): # this is designed to take a list, the value of the wshed, and save the output graph mn = min(data) mx = max(data) chart = XYLineChart(width, height, title=title, x_range=(0, len(data)), y_range=(0, mx)) chart.set_colours(["3072F3", "FF0000"]) chart.set_line_style(0, 3) chart.set_grid(20, 25, 1, 5) # set up axis and labels left_axis = chart.set_axis_labels(Axis.LEFT, [" Lowest", "Total Toxicity ", " Highest"]) chart.set_axis_style(left_axis, "202020", font_size=11, alignment=0) # add x and y data for distribution line chart.add_data(range(len(data))) chart.add_data(data) # add marker to position of ind chart.add_marker(0, ind, "d", "FF0000", 10) chart.download(outfile) return outfile
chart.add_data(x_values) row = [] total = 0 for d, count in rows: total += count row.append(total) chart.add_data(row) chart.add_data(x_values) chart.add_data([x[1] for x in rows]) chart.add_data(x_values) chart.add_data([0] * len(x_values)) chart.set_colours(['000000', 'ff0000', '000000']) chart.add_fill_range('99ccff', 0, 2) axis = range(0, 420, 420 / 6) axis[-1] = 420 chart.set_axis_labels(Axis.LEFT, map(str, axis)) axis = [datetime.combine(start, time())] step = (end - start) / 15 end = datetime.combine(end, time()) while axis[-1] < end: axis.append(axis[-1] + step) axis[-1] = end for ix, d in enumerate(axis): axis[ix] = d.strftime('%d %b')
def _make_chart(width=600, height=200, **chart_kwargs): chart = XYLineChart(width, height, **chart_kwargs) chart.set_colours(CHART_COLORS) return chart
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')
def presence_chart(days): """Returns a graph of user presence, in his language of choice.""" start = datetime.date.today() - datetime.timedelta(days=days) start = datetime.date(start.year, start.month, 1) genreh = Rehearsal.objects.filter(type='G').filter(date__gte=start).order_by('date') begreh = Rehearsal.objects.filter(type='B').filter(date__gte=start).order_by('date') concert = Concert.objects.filter(start__gte=start).order_by('start') # Calculates the vertical range max_y = 0 genreh_presence = [] active = [] begreh_presence = [] concert_presence = [] for k in genreh: active.append(((k.date-start).days, k.members.count())) if k.members.count() > max_y: max_y = k.members.count() genreh_presence.append(((k.date-start).days, k.presence().count())) for k in begreh: begreh_presence.append(((k.date-start).days, k.presence().count())) for k in concert: concert_presence.append(((k.start.date()-start).days, k.participated().count())) if k.participated().count() > max_y: max_y = k.participated().count() max_y = 5+5*(max_y/5) # Chart size of 200x125 pixels and specifying the range for the Y axis width = 500 height = 200 chart = XYLineChart(width, height, y_range=[0, max_y]) chart.add_data([k[0] for k in genreh_presence]) chart.add_data([k[1] for k in genreh_presence]) chart.add_data([k[0] for k in begreh_presence]) chart.add_data([k[1] for k in begreh_presence]) chart.add_data([k[0] for k in concert_presence]) chart.add_data([k[1] for k in concert_presence]) chart.add_data([k[0] for k in active]) chart.add_data([k[1] for k in active]) # Set the line colours chart.set_colours(['0000FF', 'FF0000', '00FF00','000000']) chart.set_legend([_(u'General rehearsals'),_(u'Beginner rehearsals'),_(u'Concerts'),_(u'Active members')]) chart.set_title(_(u'Member presence')) # Contents of each axis x_labels = range(0, max_y + 1, 5) x_labels[0] = '' chart.set_axis_labels(Axis.LEFT, x_labels) # Calculates the months months = [start.month + k for k in range(int(math.ceil(days/30)))] while max(months) > 12: for k in range(len(months)): if months[k] > 12: months[k] -= 12 labels = [k.strftime('%b') for k in [datetime.date(1970, j, 1) for j in months]] + [''] chart.set_axis_labels(Axis.BOTTOM, labels) # Set the horizontal dotted lines chart.set_grid(0, 20, 1, 5) chart.fill_linear_stripes(Chart.CHART, 0, 'CCCCCC', 1.0/(len(labels)-1), 'FFFFFF', 1.0/(len(labels)-1)) return {'url': chart.get_url(), 'width': width, 'height': height}
def main(): parseLive() stats = {} time_stats = {} fp = open("genetics.log", "r") lines = fp.readlines() header = [h.strip() for h in lines[0].split(",")] for line in lines[1:]: data = line.split(",") type = data[0].strip() generation = int(data[1]) time = int(float(data[2]) / 10) * 10 if type not in stats: stats[type] = {} time_stats[type] = {} if generation not in stats[type]: stats[type][generation] = {} if time not in time_stats[type]: time_stats[type][time] = {} d = stats[type][generation] t = time_stats[type][time] for phene, value in zip(header[3:], data[3:]): if phene not in d: d[phene] = [] d[phene].append(float(value)) if phene not in t: t[phene] = [] t[phene].append(float(value)) for s, name in [(stats, "generation"), (time_stats, "time")]: for feature in Phenotype.VALID: chart = XYLineChart(400, 300) max_wx = 0 for creature in ['rabbit', 'wolf']: WX = [] WYavg = [] WYmin = [] WYmax = [] for g, phenes in sorted(s[creature].items()): WX.append(g) WYavg.append(sum(phenes[feature]) / len(phenes[feature])) WYmin.append(min(phenes[feature])) WYmax.append(max(phenes[feature])) if len(WX) < 2: WX.append(2) chart.add_data(WX) chart.add_data(WYmin) chart.add_data(WX) chart.add_data(WYmax) chart.add_data(WX) chart.add_data(WYavg) max_wx = max(max_wx, max(WX)) chart.set_title("Phenotype: %s / %s" % (feature, name)) chart.set_colours(['ffe9bf', 'daffbf', 'ff0000', 'ebbfff', 'bffff5', '0000ff']) chart.set_legend(['rabbits-min', 'rabbits-max', 'rabbits-avg', 'wolves-min', 'wolves-max', 'wolves-avg']) chart.set_grid(0, 10, 3, 3) if name == "generation": chart.set_axis_labels(Axis.BOTTOM, range(0, max_wx + 1, 5)) else: chart.set_axis_labels(Axis.BOTTOM, range(0, max_wx + 1, 100)) chart.download("%s-%s.png" % (name, feature))
chart.add_data(x_values) row = [] total = 0 for d, count in rows: total += count row.append(total) chart.add_data(row) chart.add_data(x_values) chart.add_data([ x[1] for x in rows ]) chart.add_data(x_values) chart.add_data([ 0 ] * len(x_values)) chart.set_colours(['000000', 'ff0000', '000000']) chart.add_fill_range('99ccff', 0, 2) axis = range(0, 420, 420 / 6) axis[-1] = 420 chart.set_axis_labels(Axis.LEFT, map(str, axis)) axis = [ datetime.combine(start, time()) ] step = (end - start) / 15 end = datetime.combine(end, time()) while axis[-1] < end: axis.append(axis[-1] + step) axis[-1] = end for ix, d in enumerate(axis):