def generar_grafo_radar_norm(titulo, filas, ejes): chart = Grafo(600, 350, auto_scale=True, x_range=(0, 100), y_range=(0, 100)) #normalizamos valores saca_porcentaje = lambda x: (float(x[0]) / x[1]) * 100 fila_normalizada = map(saca_porcentaje, filas) fila_normalizada.append(fila_normalizada[0]) chart.add_data(fila_normalizada) chart.set_title(titulo) chart.set_axis_labels('x', range(1, len(ejes) + 1)) legends = [(str(i + 1) + '-' + j) for i, j in enumerate(ejes)] chart.set_legend(legends) chart.set_axis_range('y', 0, 100) chart.set_line_style(0, 2) try: return chart.get_url() except: return '/files/imagen/grafoerror.jpg'
def __init__(self,data,imagefileurl,name,label,unit_y,type= 'ggl'): self.charttype='polar' self.name = name self.label = label self.type = type self.width = 400 self.height = 300 (self.min_y,self.max_y,self.scaling_y)=ExtendRange5(0,max([max(d) for d in data])) chart = RadarChart(self.width,self.height) self.data = data for d in data: chart.add_data(d) chart.set_colours(['CC0000','339900']) #,'FFFFFF' #chart.set_legend(['max','mean','Grid: %.2f %s' % (scaling_y,unit_y)]) self.gridsize = '%.2f %s' % (self.scaling_y,unit_y) if len(data)==2: chart.set_legend(['max','mean']) chart.set_axis_labels(Axis.BOTTOM, [SelectValuesModulo(i,30) for i in range(0,359)]) for y in MyRange(self.scaling_y,self.max_y,self.scaling_y): if not self.max_y==0.0: chart.add_marker(0,float(y)/self.max_y,'h','AAAAAA',1,-1) if len(chart.markers)>5: # goole chart doesn't support more than 6 markers chart.markers = chart.markers[0:5] #if len(chart.markers)<2050: #chart.markers.append(('B', 'CC000080', '0', '1.0', '0')) chart.markers.append(('B', 'FFEE0080', '1', '1.0', '0')) #chart.add_fill_simple('FFDD00') #chart.add_horizontal_range('E5ECF9',0,30) #index = chart.set_axis_labels(Axis.BOTTOM, range(0,360,30)) #chart.set_axis_positions(index, range(0,360,30)) self.imagefileurl = chart.get_url()
def generar_grafo(queryset, titulo): '''Genera un grafo a partir de un queryset o lista de respuestas''' data = [] legends = [] labels = [] for respuesta in queryset: try: data.append(int(respuesta.respuesta.puntaje)) labels.append(respuesta.pregunta.titulo[:2]) legends.append(respuesta.pregunta.titulo[:50]) except: pass if len(data) > 2: data.append(data[0]) chart = Grafo(600, 350, auto_scale=True, x_range=(0, 5), y_range=(0, 5)) chart.add_data(data) chart.set_title(titulo) chart.set_legend(legends) chart.set_legend_position('r') chart.set_axis_labels('x', labels) chart.set_axis_range('y', 0, 5) chart.set_line_style(0, 2) try: return chart.get_url() except: return '/files/imagen/grafoerror.jpg'
def simple_random(): color ='000000' bg='FFFFFF' size=60 chart = RadarChart(120, 120, y_range=(0,100) ) chart.add_data([0] * 2) chart.add_data([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100]) chart.add_data([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,size*1.5]) chart.add_data([size,0,0,0,0,0,0,0,0,0,0,0,0,0,size,0]) chart.add_data([100] * 2) #chart.add_fill_range(color, 0, 2) chart.set_colours( [bg, 'BBBBBB', color, color, bg] ) chart.set_axis_labels(Axis.BOTTOM, ['N', '', 'NE', '', 'E', '', 'SE', '', 'S', '', 'SW', '', 'W', '', 'NW', '']) chart.set_axis_style(0, 'BBBBBB', 10, 0, 'l', bg); chart.set_line_style(1, 1) chart.set_line_style(2, 1+size/30) chart.set_line_style(3, 1+size/30) print chart.get_url() chart.download('test.png')
def render(self,data={}, context={}): # Prepare config config = ChartConfig() if context.has_key('chart'): config.__dict__.update(context['chart']) config.__dict__.update(self.__dict__) tail_config = ChartConfig() tail_config.__dict__.update(config.__dict__) if config.tail: tail_config.__dict__.update(config.tail) else: tail_config.color = "00000000" arrow_config = ChartConfig() arrow_config.__dict__.update(config.__dict__) arrow_config.text = "00000000" if config.arrow: arrow_config.__dict__.update(config.arrow) else: arrow_config.color = "00000000" gust_config = ChartConfig() gust_config.__dict__.update(config.__dict__) gust_config.text = "00000000" if config.max: gust_config.__dict__.update(config.max) else: gust_config.color = "00000000" trace_config = ChartConfig() trace_config.__dict__.update(config.__dict__) if config.trace: trace_config.__dict__.update(config.trace) sectors_config = ChartConfig() sectors_config.__dict__.update(config.__dict__) if config.sectors: sectors_config.__dict__.update(config.sectors) bars_config = ChartConfig() bars_config.__dict__.update(config.__dict__) if config.bars: bars_config.__dict__.update(config.bars) lines_config = ChartConfig() lines_config.__dict__.update(config.__dict__) if config.lines: lines_config.__dict__.update(config.lines) else: lines_config.color = "00000000" lines_config.gust = "00000000" areas_config = ChartConfig() areas_config.__dict__.update(config.__dict__) if config.areas: areas_config.__dict__.update(config.areas) beaufort_config = ChartConfig() beaufort_config.__dict__.update(config.__dict__) if config.beaufort: beaufort_config.__dict__.update(config.beaufort) # Prepare data max = config.median * 2 if data[self.key].has_key('sectors'): sector_data = data[self.key]['sectors'] # 'old' sector from db datasource else: if data.has_key(self.sector_key): # 'new' sector data from accumulator sector_data = self.calculate_accumulated_sector_data(data[self.sector_key]['series']) else: if data[self.key].has_key('series'): sector_data = self.calculate_cheap_sector_data(data[self.key]['series']) else: sector_data = None if data[self.key].has_key('value'): current_noscale = data[self.key]['value'] last_gust_noscale = data[self.key]['max'] pos = int(round(data[self.key]['deg'] * 16 / 360.0)) if pos > 15: pos = 0 current = self.scale(current_noscale, config.median, config.radius) last_gust_scaled = self.scale(last_gust_noscale, config.median, config.radius) arrow_thickness = 0.3+3.0*arrow_config.thickness*current/max if config.bars or config.areas or config.sectors: avg = [] for val in sector_data['avg']: avg.append(self.scale(val, config.median, config.radius)) avg.append(avg[0]) gust = [] for val in sector_data['max']: gust.append(self.scale(val, config.median, config.radius)) gust.append(gust[0]) else: avg = [0] * 16 gust = [0] * 16 line = [0] * 16 crown = [max] * 16 tail = [0] * 16 last_gust = [0] * 16 head = [0] * 16 if data[self.key].has_key('value'): line[pos] = max if current > 0 else 0 tail[pos] = current last_gust[pos] = last_gust_scaled head[ (pos - 1 + 16) % 16 ] = current*0.6 head[ (pos + 16) % 16 ] = current*0.3 head[ (pos + 1) % 16 ] = current*0.6 chart = RadarChart(config.width, config.height, y_range=(0,max) ) chart.add_data([0] * 2) chart.add_data(line) chart.add_data(gust) chart.add_data(avg) chart.add_data(crown) chart.add_data(tail) chart.add_data(head) chart.add_data(last_gust) if config.bars: chart.add_marker(2, -1, "v", _valid_color(bars_config.gust), bars_config.thickness, -1) chart.add_marker(3, -1, "v", _valid_color(bars_config.color), bars_config.thickness, -1) if config.beaufort: chart.add_marker(0, "220:0.9", "@t"+str(int(round(wfcommon.units.MpsToBft(current_noscale)))), _valid_color(beaufort_config.color) + "%02x" % (beaufort_config.intensity*255), rmin(config.height, config.width)-config.size*5, -1) colors = ["00000000", _valid_color(tail_config.color), _valid_color(lines_config.gust), _valid_color(lines_config.color), "00000000", _valid_color(arrow_config.color), _valid_color(arrow_config.color), "00000000"] if config.sectors: for i in range(0,16): sec = [0] * 16 avg = self.scale(sector_data['avg'][i], config.median, config.radius) freq_value = sector_data['freq'][i]*255 freq_value = rmin(255, (1+2*sectors_config.intensity) * freq_value) freq = "%02x" % int(freq_value) start = i-0.5 stop = i+0.5 chart.add_vertical_range(_valid_color(sectors_config.color)+freq, start, stop) if config.trace: nval = len(data[self.key]['series']['deg']) nbullet = rmin(trace_config.length, nval) minsize = trace_config.size / float(trace_config.ratio) maxsize = trace_config.size size = float(maxsize) inc = (maxsize-minsize) / nbullet n = 0 for p in reversed(data[self.key]['series']['deg']): chart.add_marker(4, int(p/22.5), 'o', _valid_color(trace_config.color), size) size = size - inc n = n + 1 if n == nbullet: break if config.areas: chart.add_fill_range(_valid_color(areas_config.gust), 3, 2) chart.add_fill_range(_valid_color(areas_config.color), 3, 0) if config.max: chart.add_marker(7, pos, 'o', _valid_color(gust_config.color), gust_config.thickness) chart.add_marker(7, pos, 't'+str(round(last_gust_noscale,1)), _valid_color(gust_config.text), gust_config.size) if config.arrow: chart.add_marker(0, 0, 'o', _valid_color(arrow_config.color), arrow_thickness) chart.add_marker(5, pos, 't'+str(round(current_noscale,1)), _valid_color(arrow_config.text), arrow_config.size) chart.add_fill_range(_valid_color(arrow_config.fill), 6, 0) chart.set_colours( colors ) if config.axes: chart.set_axis_labels(Axis.BOTTOM, ['N', '', 'NE', '', 'E', '', 'SE', '', 'S', '', 'SW', '', 'W', '', 'NW', '']) chart.set_axis_style(0, _valid_color(config.text), config.size, 0, 'l', _valid_color(config.bgcolor)); if data[self.key].has_key('value'): chart.set_line_style(1, tail_config.thickness) else: chart.set_line_style(1, 0) chart.set_line_style(2, lines_config.thickness) chart.set_line_style(3, lines_config.thickness) chart.set_line_style(4, 0) if data[self.key].has_key('value'): chart.set_line_style(5, arrow_thickness) chart.set_line_style(6, arrow_thickness) else: chart.set_line_style(5, 0) chart.set_line_style(6, 0) chart.fill_solid(Chart.BACKGROUND, _valid_color(config.bgcolor)) return chart.get_url()
def render(self, data={}, context={}): # Prepare config config = ChartConfig() if context.has_key('chart'): config.__dict__.update(context['chart']) config.__dict__.update(self.__dict__) tail_config = ChartConfig() tail_config.__dict__.update(config.__dict__) if config.tail: tail_config.__dict__.update(config.tail) else: tail_config.color = "00000000" arrow_config = ChartConfig() arrow_config.__dict__.update(config.__dict__) arrow_config.text = "00000000" if config.arrow: arrow_config.__dict__.update(config.arrow) else: arrow_config.color = "00000000" gust_config = ChartConfig() gust_config.__dict__.update(config.__dict__) gust_config.text = "00000000" if config.max: gust_config.__dict__.update(config.max) else: gust_config.color = "00000000" trace_config = ChartConfig() trace_config.__dict__.update(config.__dict__) if config.trace: trace_config.__dict__.update(config.trace) sectors_config = ChartConfig() sectors_config.__dict__.update(config.__dict__) if config.sectors: sectors_config.__dict__.update(config.sectors) bars_config = ChartConfig() bars_config.__dict__.update(config.__dict__) if config.bars: bars_config.__dict__.update(config.bars) lines_config = ChartConfig() lines_config.__dict__.update(config.__dict__) if config.lines: lines_config.__dict__.update(config.lines) else: lines_config.color = "00000000" lines_config.gust = "00000000" areas_config = ChartConfig() areas_config.__dict__.update(config.__dict__) if config.areas: areas_config.__dict__.update(config.areas) beaufort_config = ChartConfig() beaufort_config.__dict__.update(config.__dict__) if config.beaufort: beaufort_config.__dict__.update(config.beaufort) # Prepare data max = config.median * 2 if data[self.key].has_key('sectors'): sector_data = data[self.key][ 'sectors'] # 'old' sector from db datasource else: if data.has_key( self.sector_key): # 'new' sector data from accumulator sector_data = self.calculate_accumulated_sector_data( data[self.sector_key]['series']) else: if data[self.key].has_key('series'): sector_data = self.calculate_cheap_sector_data( data[self.key]['series']) else: sector_data = None if data[self.key].has_key('value'): current_noscale = data[self.key]['value'] last_gust_noscale = data[self.key]['max'] pos = int(round(data[self.key]['deg'] * 16 / 360.0)) if pos > 15: pos = 0 current = self.scale(current_noscale, config.median, config.radius) last_gust_scaled = self.scale(last_gust_noscale, config.median, config.radius) arrow_thickness = 0.3 + 3.0 * arrow_config.thickness * current / max if config.bars or config.areas or config.sectors: avg = [] for val in sector_data['avg']: avg.append(self.scale(val, config.median, config.radius)) avg.append(avg[0]) gust = [] for val in sector_data['max']: gust.append(self.scale(val, config.median, config.radius)) gust.append(gust[0]) else: avg = [0] * 16 gust = [0] * 16 line = [0] * 16 crown = [max] * 16 tail = [0] * 16 last_gust = [0] * 16 head = [0] * 16 if data[self.key].has_key('value'): line[pos] = max if current > 0 else 0 tail[pos] = current last_gust[pos] = last_gust_scaled head[(pos - 1 + 16) % 16] = current * 0.6 head[(pos + 16) % 16] = current * 0.3 head[(pos + 1) % 16] = current * 0.6 chart = RadarChart(config.width, config.height, y_range=(0, max)) chart.add_data([0] * 2) chart.add_data(line) chart.add_data(gust) chart.add_data(avg) chart.add_data(crown) chart.add_data(tail) chart.add_data(head) chart.add_data(last_gust) if config.bars: chart.add_marker(2, -1, "v", _valid_color(bars_config.gust), bars_config.thickness, -1) chart.add_marker(3, -1, "v", _valid_color(bars_config.color), bars_config.thickness, -1) if config.beaufort: chart.add_marker( 0, "220:0.9", "@t" + str(int(round(wfcommon.units.MpsToBft(current_noscale)))), _valid_color(beaufort_config.color) + "%02x" % (beaufort_config.intensity * 255), rmin(config.height, config.width) - config.size * 5, -1) colors = [ "00000000", _valid_color(tail_config.color), _valid_color(lines_config.gust), _valid_color(lines_config.color), "00000000", _valid_color(arrow_config.color), _valid_color(arrow_config.color), "00000000" ] if config.sectors: for i in range(0, 16): sec = [0] * 16 avg = self.scale(sector_data['avg'][i], config.median, config.radius) freq_value = sector_data['freq'][i] * 255 freq_value = rmin(255, (1 + 2 * sectors_config.intensity) * freq_value) freq = "%02x" % int(freq_value) start = i - 0.5 stop = i + 0.5 chart.add_vertical_range( _valid_color(sectors_config.color) + freq, start, stop) if config.trace: nval = len(data[self.key]['series']['deg']) nbullet = rmin(trace_config.length, nval) minsize = trace_config.size / float(trace_config.ratio) maxsize = trace_config.size size = float(maxsize) inc = (maxsize - minsize) / nbullet n = 0 for p in reversed(data[self.key]['series']['deg']): chart.add_marker(4, int(p / 22.5), 'o', _valid_color(trace_config.color), size) size = size - inc n = n + 1 if n == nbullet: break if config.areas: chart.add_fill_range(_valid_color(areas_config.gust), 3, 2) chart.add_fill_range(_valid_color(areas_config.color), 3, 0) if config.max: chart.add_marker(7, pos, 'o', _valid_color(gust_config.color), gust_config.thickness) chart.add_marker(7, pos, 't' + str(round(last_gust_noscale, 1)), _valid_color(gust_config.text), gust_config.size) if config.arrow: chart.add_marker(0, 0, 'o', _valid_color(arrow_config.color), arrow_thickness) chart.add_marker(5, pos, 't' + str(round(current_noscale, 1)), _valid_color(arrow_config.text), arrow_config.size) chart.add_fill_range(_valid_color(arrow_config.fill), 6, 0) chart.set_colours(colors) if config.axes: chart.set_axis_labels(Axis.BOTTOM, [ 'N', '', 'NE', '', 'E', '', 'SE', '', 'S', '', 'SW', '', 'W', '', 'NW', '' ]) chart.set_axis_style(0, _valid_color(config.text), config.size, 0, 'l', _valid_color(config.bgcolor)) if data[self.key].has_key('value'): chart.set_line_style(1, tail_config.thickness) else: chart.set_line_style(1, 0) chart.set_line_style(2, lines_config.thickness) chart.set_line_style(3, lines_config.thickness) chart.set_line_style(4, 0) if data[self.key].has_key('value'): chart.set_line_style(5, arrow_thickness) chart.set_line_style(6, arrow_thickness) else: chart.set_line_style(5, 0) chart.set_line_style(6, 0) chart.fill_solid(Chart.BACKGROUND, _valid_color(config.bgcolor)) return chart.get_url()
def generar_grafo_radar_norm(titulo, filas, ejes): chart = Grafo(600, 350, auto_scale=True, x_range=(0,100), y_range=(0,100)) #normalizamos valores saca_porcentaje = lambda x : (float(x[0])/x[1]) * 100 fila_normalizada = map(saca_porcentaje, filas) fila_normalizada.append(fila_normalizada[0]) chart.add_data(fila_normalizada) chart.set_title(titulo) chart.set_axis_labels('x', range(1, len(ejes)+ 1)) legends = [(str(i+1) + '-' + j) for i, j in enumerate(ejes)] chart.set_legend(legends) chart.set_axis_range('y', 0, 100) chart.set_line_style(0, 2) try: return chart.get_url() except: return '/files/imagen/grafoerror.jpg'
def generar_grafo(queryset, titulo): '''Genera un grafo a partir de un queryset o lista de respuestas''' data = [] legends = [] labels = [] for respuesta in queryset: try: data.append(int(respuesta.respuesta.puntaje)) labels.append(respuesta.pregunta.titulo[:2]) legends.append(respuesta.pregunta.titulo[:50]) except: pass if len(data) > 2: data.append(data[0]) chart = Grafo(600, 350, auto_scale=True, x_range=(0,5), y_range=(0,5)) chart.add_data(data) chart.set_title(titulo) chart.set_legend(legends) chart.set_legend_position('r') chart.set_axis_labels('x', labels) chart.set_axis_range('y', 0, 5) chart.set_line_style(0, 2) try: return chart.get_url() except: return '/files/imagen/grafoerror.jpg'