Ejemplo n.º 1
0
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'
Ejemplo n.º 2
0
 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()
Ejemplo n.º 3
0
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'
Ejemplo n.º 4
0
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')
Ejemplo n.º 5
0
    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()
Ejemplo n.º 6
0
    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()
Ejemplo n.º 7
0
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'
Ejemplo n.º 8
0
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'