def main(args): roomsize_message_count = Counter() def accum(dct): roomsize_message_count[int(dct['num_recipients'])] += 1 ReadCSVFile(args.file, accum) if args.max_roomsize: sizes = [args.max_roomsize] else: sizes = sorted(roomsize_message_count.keys()) points = [] for size in sizes: points.append((size, (args.price_per_xmpp * calculate_messages( roomsize_message_count, size, args.ignore_large_rooms)))) if args.csv: for p in points: print '%s,%s' % p else: x = [q[0] for q in points] y = [q[1] for q in points] from pygooglechart import XYLineChart, Axis chart = XYLineChart(400, 400) chart.add_data(x) chart.add_data(y) # chart.set_axis_labels(Axis.BOTTOM, 'max users/channel') # chart.set_axis_labels(Axis.LEFT, 'approx cost / week') print chart.get_url() + '&chxt=x,y' return 0
def main(args): roomsize_message_count = Counter() def accum(dct): roomsize_message_count[int(dct['num_recipients'])] += 1 ReadCSVFile(args.file, accum) if args.max_roomsize: sizes = [args.max_roomsize] else: sizes = sorted(roomsize_message_count.keys()) points = [] for size in sizes: points.append((size, (args.price_per_xmpp * calculate_messages(roomsize_message_count, size, args.ignore_large_rooms) ) ) ) if args.csv: for p in points: print '%s,%s' % p else: x = [q[0] for q in points] y = [q[1] for q in points] from pygooglechart import XYLineChart, Axis chart = XYLineChart(400, 400) chart.add_data(x) chart.add_data(y) # chart.set_axis_labels(Axis.BOTTOM, 'max users/channel') # chart.set_axis_labels(Axis.LEFT, 'approx cost / week') print chart.get_url()+'&chxt=x,y' return 0
def chart(ui, repo, *pats, **opts): '''Create graphs of revision data This command will graph count of changed lines or revisions grouped by date. Statistics are based on the number of changed lines, or alternatively the number of matching revisions if the --changesets option is specified. Examples:: # create chart of changed lines for every day hg chart # create chart of changesets for every day hg chart -f '%H' -c ''' width = opts.get('width') height = opts.get('height') if width * height > 300000: raise util.Abort(_('area must be less than 300,000')) rate = countrate(ui, repo, *pats, **opts).items() if not rate: raise util.Abort(_('no matching revisions found')) if len(rate) == 1: raise util.Abort(_('only one data point found')) pairs = [(k,v) for k,v in rate] pairs.sort(lambda x, y: x[0] - y[0]) if len(pairs) > width: combine = int(math.ceil(float(len(pairs)) / width)) newpairs = [] while pairs: newpairs.append((pairs[0][0], reduce(lambda x,y: x + y[1], pairs[0:combine], 0))) del pairs[0:combine] pairs = newpairs keys = [x[0] for x in pairs] vals = [x[1] for x in pairs] ymax = max(vals) chart = XYLineChart(width, height, x_range=(keys[0], keys[-1]), y_range=(0, ymax)) if not opts.get('nolabels'): chart.set_axis_range(Axis.LEFT, 0, ymax) chart.set_axis_labels(Axis.BOTTOM, map(lambda x: datetime.datetime(*time.gmtime(x)[:6]).strftime('%x'), range(keys[0], keys[-1]+1, (keys[-1] - keys[0])/max(1,int(width/100))))) chart.add_data(keys) chart.add_data(vals) print 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 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 graph(self): to = copy.deepcopy(self.tour_order) # add 1st city at the end for graphing purposes to.append(to[0]) chart = XYLineChart(MAP_SIZE, MAP_SIZE, x_range=(0, MAP_SIZE), y_range=(0, MAP_SIZE)) xcoords = [c.getx() for c in to] ycoords = [c.gety() for c in to] chart.add_data(xcoords) chart.add_data(ycoords) webbrowser.open(chart.get_url())
def graph(self): """ graph the building as a polygon using google charts """ chart = XYLineChart(200, 200, x_range=(0, 200), y_range=(0, 200)) xdata = [] ydata = [] for n in self.verticies: x,y = n xdata.append(x) ydata.append(y) chart.add_data(xdata) chart.add_data(ydata) webbrowser.open(chart.get_url())
def altitude_profile_gchart(db, route): # First calculate the altitude profile profile = altitude_profile(db, route) # Create gchart # http://code.google.com/apis/chart/#line_charts # http://pygooglechart.slowchop.com/ # For the horizontal scale, we need to know the horizontal distance # between the coordinates. First point will have coordinate 0, last # point the sum of all distances. # y coordinates are the altitudes. x_coordinates = [0] y_coordinates = [] for i in range(len(profile)-1): x_coordinates.append(x_coordinates[i]) x_coordinates[i+1] += distance.distance( (profile[i]['lat'],profile[i]['lon'] ), (profile[i+1]['lat'],profile[i+1]['lon'] ) ).kilometers y_coordinates.append(profile[i]['alt']) y_coordinates.append(profile[-1]['alt']) # Create gchart # http://code.google.com/apis/chart/#line_charts # http://pygooglechart.slowchop.com/ chart = XYLineChart(325, 200, x_range=(0,max(x_coordinates)), y_range=(min(y_coordinates),max(y_coordinates))) chart.add_data(x_coordinates) chart.add_data(y_coordinates) chart.set_axis_labels(Axis.BOTTOM, ['0', str(max(x_coordinates))[0:4] + " km"]) chart.set_axis_labels(Axis.LEFT, [str(int(min(y_coordinates))) + " m", str(int(max(y_coordinates))) + " m"]) # Return gchart url: return chart.get_url()
def novidomejni_grafik(): """По датум последните 30 дена колку нови домејни имало.""" c1 = conn.cursor() c1.execute( "select datum, novidomejni from novidomejni order by datum desc limit 30" ) novi = [x for x in c1] novi.sort() datumi = [x[0] for x in novi] ipsilonoska = [int(x[1]) for x in novi] # kolku novi iksoska = [x for x in range(0, len(datumi))] xmax = len(iksoska) ymax = max([int(a[1]) for a in novi]) chart = XYLineChart(800, 300, x_range=(0, xmax - 1), y_range=(0, ymax)) chart.add_data(iksoska) chart.add_data(ipsilonoska) for x in range(0, len(datumi)): if x % 2: datumi[x] = '' ipsilon = [x for x in range(0, ymax + 1)] for y in range(0, ymax + 1): if y % 2: ipsilon[y] = '' ipsilon[0] = '' ipsilon[-1] = ymax chart.set_axis_labels(Axis.BOTTOM, datumi) chart.set_axis_labels(Axis.LEFT, ipsilon) chart.set_title("Број на нови .mk домени по денови|") return chart.get_url()
def novidomejni_grafik(): """По датум последните 30 дена колку нови домејни имало.""" c1 = conn.cursor() c1.execute("select datum, novidomejni from novidomejni order by datum desc limit 30") novi = [x for x in c1] novi.sort() datumi = [x[0] for x in novi] ipsilonoska = [int(x[1]) for x in novi] # kolku novi iksoska = [x for x in range(0,len(datumi))] xmax = len(iksoska) ymax = max([int(a[1]) for a in novi]) chart = XYLineChart(800,300,x_range=(0,xmax-1),y_range=(0,ymax)) chart.add_data(iksoska) chart.add_data(ipsilonoska) for x in range(0,len(datumi)): if x%2: datumi[x]='' ipsilon = [ x for x in range(0,ymax+1)] for y in range(0,ymax+1): if y%2: ipsilon[y]='' ipsilon[0]='' ipsilon[-1]=ymax chart.set_axis_labels(Axis.BOTTOM,datumi) chart.set_axis_labels(Axis.LEFT, ipsilon) chart.set_title("Број на нови .mk домени по денови|") return chart.get_url()
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}