def __add_graph(self): drawing = Drawing(200, 100) data = list() labels = list() self.c.drawString(370, 730, 'Distribucion en pesos'.encode('utf-8')) for acc in self.accounts: balance = acc.balance if acc.currency == 'USD': balance = balance * self.dolar data.append(balance) labels.append(acc.name) pie = Pie() pie.x = 280 pie.y = 630 pie.height = 100 pie.width = 100 pie.data = data pie.labels = labels pie.simpleLabels = 1 pie.slices.strokeWidth = 1 pie.slices.strokeColor = black pie.slices.label_visible = 0 legend = Legend() legend.x = 400 legend.y = 680 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fontSize = 7 legend.boxAnchor = 'w' legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = 'right' legend.dividerLines = 1|2|4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 n = len(pie.data) self.__setItems(n,pie.slices, 'fillColor',self.pdf_chart_colors) legend.colorNamePairs = [(pie.slices[i].fillColor, (pie.labels[i][0:20],'$%0.2f' % pie.data[i])) for i in xrange(n)] drawing.add(pie) drawing.add(legend) x, y = 0, 0 renderPDF.draw(drawing, self.c, x, y, showBoundary=False)
def __init__(self, drawing=None, title=None, data=None, x=45, y=25, width=170, height=130): if len(data) > 1: y = y + 22 height = height - 22 bars = HorizontalBarChart() bars.x = x bars.y = y bars.data = [[value for (_, value) in category] for category in data] bars.width = width bars.height = height bars.valueAxis.forceZero = 1 bars.valueAxis.labels.fontName = 'Lato' bars.valueAxis.labels.fontSize = 9 bars.valueAxis.strokeColor = white bars.valueAxis.visibleGrid = 1 bars.bars[0].fillColor = toColor(my_color_func()) bars.bars.strokeColor = white bars.categoryAxis.categoryNames = [key for (key, _) in data[0]] bars.categoryAxis.tickRight = 0 bars.categoryAxis.tickLeft = 0 #bars.categoryAxis.strokeColor = white bars.categoryAxis.labels.fontName = 'Lato' bars.categoryAxis.labels.fontSize = 9 legend = Legend() legend.y = 25 legend.x = 95 legend.strokeColor = white legend.alignment = 'right' legend.fontName = 'Lato' legend.fontSize = 9 legend.dx = 6 legend.dy = 6 legend.dxTextSpace = 5 legend.deltay = 10 legend.strokeWidth = 0 legend.strokeColor = white colors = map(toColor, get_n_random_colors(len(data))) for (i, color) in enumerate(colors): bars.bars[i].fillColor = color if len(data) > 1: legend_data = (title, 'Benchmark') legend.colorNamePairs = zip(colors, legend_data) drawing.add(legend) drawing.add(bars)
def __init__(self, drawing=None, data=None): #Drawing.__init__(self, width=100, height=175) pie = Pie() pie.strokeColor = white pie.slices.strokeColor = white pie.slices.popout = 1 pie.width = 100 pie.height = 100 pie.y = 50 pie.x = 80 legend = Legend() legend.columnMaximum = 99 legend.alignment = 'right' legend.boxAnchor = 'c' legend.dx = 6 legend.dy = 6 legend.dxTextSpace = 5 legend.deltay = 10 legend.strokeWidth = 0 legend.strokeColor = white legend.subCols[0].minWidth = 75 legend.subCols[0].align = 'left' legend.subCols[1].minWidth = 25 legend.subCols[1].align = 'right' legend.y = 20 legend.x = 128 legend.fontName = 'Lato' legend.fontSize = 9 pie.data = data pie.slices[0].fillColor = lightgrey pie.slices[1].fillColor = limegreen pie.slices[1].popout = 6 pie.slices[2].fillColor = red #pie.slices[2].popout = 1 neutral_pct = positive_pct = negative_pct = 0 total = sum(data) if total > 0: neutral_pct = (data[0] / total) * 100.0 positive_pct = (data[1] / total) * 100.0 negative_pct = (data[2] / total) * 100.0 legend.colorNamePairs = [ (limegreen, ('Positive', '%.1f%%' % positive_pct)), (lightgrey, ('Neutral', '%.1f%%' % neutral_pct)), (red, ('Negative', '%.1f%%' % negative_pct)) ] drawing.add(pie) drawing.add(legend)
def getPieChart(c, x, y, data, data_suff, labels, colors, fsize=8.5, radius=0.60, legdx=180, legdy=100): """ Function to draw a Pie Chart """ d = Drawing(200, 200) legend = Legend() legend.columnMaximum = 99 legend.alignment = 'right' legend.dx = 7 legend.dy = 7 legend.dxTextSpace = 5 legend.deltay = 10 legend.strokeWidth = 0 legend.strokeColor = HexColor("0xffffff") legend.subCols[0].minWidth = 75 legend.subCols[0].align = 'left' legend.boxAnchor = 'c' legend.y = legdy legend.x = legdx legend.fontName = "MavenPro" legend.fontSize = 8.5 legendList = [] for k, i in enumerate(colors): legendList.append((HexColor(i), labels[k])) legend.colorNamePairs = legendList pc3 = Pie() pc3.x = 10 pc3.y = 10 pc3.data = data pc3.labels = [str(r) + data_suff if r >= 15 else "" for r in data] pc3.slices.strokeColor = HexColor("0xffffff") pc3.slices.labelRadius = radius pc3.slices.fontName = "MavenPro" pc3.slices.fontSize = fsize pc3.slices.fontColor = HexColor("0xffffff") for k, i in enumerate(colors): pc3.slices[k].fillColor = HexColor(i) d.add(pc3, 'pie3') d.add(legend, 'legend') d.drawOn(c, x, y)
def __init__(self, drawing=None, title=None, data=None, bench_data=None): pie = Pie() pie.strokeColor = white pie.slices.strokeColor = white pie.slices.popout = 1 pie.width = 85 pie.height = 85 pie.y = 50 pie.x = 35 bench_pie = Pie() bench_pie.strokeColor = white bench_pie.slices.strokeColor = white bench_pie.slices.popout = 1 bench_pie.width = 85 bench_pie.height = 85 bench_pie.y = 50 bench_pie.x = 150 legend = Legend() legend.columnMaximum = 99 legend.alignment = 'right' legend.boxAnchor = 'c' legend.dx = 6 legend.dy = 6 legend.dxTextSpace = 5 legend.deltay = 10 legend.strokeWidth = 0 legend.strokeColor = white legend.subCols[0].minWidth = 75 legend.subCols[0].align = 'left' legend.subCols[1].minWidth = 25 legend.subCols[1].align = 'right' legend.y = 20 legend.x = 153 legend.fontName = 'Lato' legend.fontSize = 9 pie.data = data pie.slices[0].fillColor = lightgrey pie.slices[1].fillColor = limegreen #pie.slices[1].popout = 6 pie.slices[2].fillColor = red bench_pie.data = bench_data bench_pie.slices[0].fillColor = lightgrey bench_pie.slices[1].fillColor = limegreen #bench_pie.slices[1].popout = 6 bench_pie.slices[2].fillColor = red legend.colorNamePairs = [(limegreen, 'Positive'), (lightgrey, 'Neutral'), (red, 'Negative')] drawing.add( String(x=75, y=145, text=title, fontSize=10, fontName='Lato', textAnchor='middle')) drawing.add( String(x=165, y=145, text='Benchmark', fontSize=10, fontName='Lato')) drawing.add(pie) drawing.add(bench_pie) drawing.add(legend)
def crear_informe(self): guion = [] d = Drawing(300, 200) tarta = Pie() tarta.x = 65 tarta.y = 15 tarta.width = 170 tarta.height = 170 tarta.data = [] tarta.labels = [] cores = [] follaEstilo = getSampleStyleSheet() _HEX = list('0123456789ABCDEF') j=False ventasMarca=metodosBase.metodosBase.listar_ventas_marca(self) for ventaMarca in ventasMarca: tarta.data.append(ventaMarca[0]) tarta.labels.append(ventaMarca[1]) color = '#' + ''.join(_HEX[random.randint(0, len(_HEX)-1)] for _ in range(6)) cores.append(colors.HexColor(color)) if ((tarta.data[0] is not None) and j==False): mayor = tarta.data[0] indice=0 j=True else: if(ventaMarca[0]>=mayor): mayor=ventaMarca[0] tarta.slices.strokeWidth = 0.2 # anchura das liñas tarta.sideLabels = 1 tarta.slices[tarta.data.index(mayor)].popout = 10 # destacase o gajo que pomos entre corchetes, o que ten maior valor de todos tarta.slices[tarta.data.index(mayor)].strokeWidth = 2 # a este gajo en concreto cambiamos o tamaño da liña tarta.slices[tarta.data.index(mayor)].labelRadius = 1.20 # radio da etiqueta , cambiamolo para este elemento tarta.slices[tarta.data.index(mayor)].fontColor = colors.red lenda = Legend() lenda.x = 370 lenda.y = 0 lenda.dx = 8 lenda.dy = 8 lenda.fontName = 'Helvetica' lenda.fontSize = 7 lenda.boxAnchor = 'n' lenda.columnMaximum = 10 lenda.strokeColor = colors.black lenda.strokeWidth = 1 lenda.deltax = 75 lenda.deltay = 10 lenda.autoXPadding = 5 lenda.yGap = 0 lenda.dxTextSpace = 5 lenda.alignment = 'right' lenda.dividerLines = 1 | 2 | 4 lenda.dividerOffsY = 4.5 lenda.subCols.rpad = 30 for i, color in enumerate(cores): tarta.slices[i].fillColor = color lenda.colorNamePairs = [(tarta.slices[i].fillColor, (tarta.labels[i][0:20], '%0.2f' % tarta.data[i]) ) for i in range(len(tarta.data))] '''parrafo 1 : cabeceira primeira grafica''' cabeceira = follaEstilo['Heading4'] # formato por defecto cabeceira.pageBreakBefore = 0 # con un uno a primeira folla queda en branco cabeceira.keepWitNext = 0 # para que non nos deixe a primeira paxina en branco cabeceira.backColor = colors.lightcyan parrafo = Paragraph("Informe de ventas por marcas", cabeceira) guion.append(parrafo) guion.append(Spacer(0, 40)) d.add(lenda) d.add(tarta) guion.append(d) guion.append(Spacer(0, 60)) '''parrafo 2:cabeceira segunda grafica''' cabeceira2 = follaEstilo['Heading4'] # formato por defecto cabeceira2.pageBreakBefore = 0 # con un uno a primeira folla queda en branco cabeceira2.keepWitNext = 0 # para que non nos deixe a primeira paxina en branco cabeceira2.backColor = colors.lightcyan parrafo2 = Paragraph("Informe de ventas por año de matriculación", cabeceira) guion.append(parrafo2) guion.append(Spacer(0, 40)) d2 = Drawing(400, 200) lc = HorizontalLineChart() lc.x = 30 lc.y = 50 lc.height = 125 lc.width = 350 lc.data = [] lista=[] lc.categoryAxis.categoryNames = [] ventasAno = metodosBase.metodosBase.listar_ventas_anoMatricula(self) for ventaAno in ventasAno: lista.append(ventaAno[0]) lc.categoryAxis.categoryNames.append(str(ventaAno[1])) lc.data.append(lista) lc.categoryAxis.labels.boxAnchor = 'n' lc.valueAxis.valueMin = 0 lc.valueAxis.valueMax = 12 lc.valueAxis.valueStep = 2 lc.lines[0].strokeWidth = 2 lc.lines[0].symbol = makeMarker('FilledCircle') # círculos rellenos lc.lines[1].strokeWidth = 1.5 d2.add(lc) guion.append(d2) guion.append(Spacer(0, 20)) cabeceira3 = follaEstilo['Normal'] # formato por defecto parrafo3 = Paragraph(" COCHESJOSE S.L. CARRETERA INFINITA S/N , TELEFONO:986505050", cabeceira3) cabeceira3.keepWitNext = 0 # para que non nos deixe a primeira paxina en branco guion.append(parrafo3) guion.append(Spacer(0, 20)) doc = SimpleDocTemplate("informeVentas.pdf", pagesize=A4) doc.build(guion)
def generarGraficoProveedores(self): nombres = [] cantidades = [] self.iniciar_conexion() cursor = self.__conexion.cursor() sql = "select nombre_empresa,count(prod.id_proveedor) as cantidad from productos prod,proveedores prov where prod.id_proveedor=prov.id_proveedor group by nombre_empresa" cursor.execute(sql) rows = cursor.fetchall() for row in rows: nombre_empresa = row[0] cantidad = row[1] nombres.append(nombre_empresa) cantidades.append(cantidad) #print(nombre_empresa+"-"+str(cantidad)+"-") self.cerrar_conexion() reporte = SimpleDocTemplate("graficoProveedores.pdf") partes = [] font_text = ParagraphStyle("test") font_text.textColor = "black" font_text.alignment = TA_CENTER font_text.fontSize = 20 text = Paragraph("Reporte grafico de proveedores", font_text) partes.append(text) draw = Drawing() pie = Pie() pie.width = 300 pie.height = 200 pie.x = 50 pie.y = -100 pie.data = cantidades pie.labels = nombres pie.slices.strokeWidth = 0.5 legend = Legend() legend.x = 250 legend.y = -200 legend.dx = 8 legend.dy = 8 legend.fontName = "Helvetica" legend.fontSize = 7 legend.boxAnchor = "n" legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = colors.black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = "right" legend.dividerLines = 1 | 2 | 4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 legend.colorNamePairs = [(pie.slices[i].fillColor, (pie.labels[i][0:20], "%0.0f prod" % pie.data[i])) for i in xrange(len(pie.data))] draw.add(legend) draw.add(pie) partes.append(draw) reporte.build(partes) if (os.path.isfile("graficoProveedores.pdf")): return True else: return False
def get_pdf_results(task_id): # Flask response response = Response() response.status_code = 200 task = data.get_task_result(task_id) #Saving file to a in-memory file output_file = StringIO.StringIO() def header_footer(canvas, doc): canvas.saveState() background = 'static/img/pdf_bg.png' canvas.drawImage(background, 1 * inch, 5.75 * inch, width=8 * inch, height=6 * inch, mask='auto') # Header logo = Image('static/img/logo/logo.png') logo.drawHeight = 0.5 * inch logo.drawWidth = 1.75 * inch date = datetime.now().strftime("%y-%m-%d %H:%M") headerData = [[logo, '', date]] headerTable = Table(headerData, colWidths=[2 * inch, 3.58 * inch, 1.2 * inch], style=[('LINEBELOW', (0, 0), (2, 0), 1, colors.HexColor(0xcccccc)), ('TEXTCOLOR', (0, 0), (2, 0), colors.HexColor(0x807F83)), ('VALIGN', (1, 0), (1, 0), 'MIDDLE'), ('VALIGN', (2, 0), (2, 0), 'MIDDLE')]) headerTable.wrapOn(canvas, doc.width, doc.topMargin) headerTable.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin) pageNum = "Page %d" % doc.page footerData = [[ 'KAPSARC Building Energy Assessment Tool (BEAT)', pageNum ]] footerTable = Table(footerData, colWidths=[5.76 * inch, 1 * inch], style=[('LINEABOVE', (0, 0), (1, 0), 2, colors.HexColor(0xcccccc)), ('TEXTCOLOR', (0, 0), (1, 0), colors.HexColor(0x807F83)), ('ALIGN', (1, 0), (1, 0), 'RIGHT')]) footerTable.wrapOn(canvas, doc.width, doc.bottomMargin) footerTable.drawOn(canvas, doc.leftMargin, 0.5 * inch) canvas.restoreState() pdfmetrics.registerFont(TTFont('Vera', 'Vera.ttf')) pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf')) pdfmetrics.registerFont(TTFont('VeraIt', 'VeraIt.ttf')) pdfmetrics.registerFont(TTFont('VeraBI', 'VeraBI.ttf')) styles = getSampleStyleSheet() # Title styles.add( ParagraphStyle(name='styleTitle', alignment=TA_CENTER, fontSize=16, fontName='Vera', textColor=colors.HexColor(0x61a659), leading=30, spaceBefore=35, spaceAfter=10)) # Headings styles.add( ParagraphStyle(name='styleHeading', parent=styles['Heading2'], fontSize=14, textColor=colors.HexColor(0x807F83), leading=20, spaceBefore=10, underlineProportion=1.1, spaceAfter=10)) styles.add( ParagraphStyle(name='styleHeading2', parent=styles['Heading2'], fontSize=14, textColor=colors.HexColor(0x61a659), leading=20, spaceBefore=20, underlineProportion=1.1, spaceAfter=20)) styles.add( ParagraphStyle( name='styleHeading3', #alignment= TA_CENTER, fontSize=12, fontName='Vera', textColor=colors.HexColor(0x61a659), leading=20, spaceBefore=10, spaceAfter=5)) # Body text styles.add( ParagraphStyle(name='styleBodyText', parent=styles['Normal'], fontSize=9, textColor=colors.HexColor(0x666666), spaceBefore=5, spaceAfter=15)) styleTitle = styles['styleTitle'] styleHeading = styles['styleHeading'] styleHeading2 = styles['styleHeading2'] styleHeading3 = styles['styleHeading3'] styleBodyText = styles['styleBodyText'] pdf_chart_colors = [ "#3D6531", "#61a24f", "#89B97B", "#B0D1A7", "#cde5c7", "#7e7f82", "#9E9FA1", "#BFBFC1", "#DFDFE0", "#ffd200", "#FFE360", "#FFEE9F", ] Elements = [] doc = BaseDocTemplate(output_file, showBoundary=0, pagesize=A4, title='KASPSARC BEAT Report', author="KAPSARC", leftMargin=0.75 * inch, rightMargin=0.75 * inch, topMargin=inch, bottomMargin=inch) frame = Frame(doc.leftMargin, doc.topMargin, doc.width, doc.height, topPadding=0.3 * inch, showBoundary=0) template = PageTemplate(id='template', frames=[frame], onPage=header_footer) doc.addPageTemplates([template]) ## PAGE 1 #add some flowables Elements.append( Paragraph("KAPSARC Building Energy Assessment Tool (BEAT)", styleTitle)) Elements.append(Paragraph("Your Building Description", styleHeading)) rowHeights = 0.3 * inch calibrationData = task['calibrationData'] Elements.append(Paragraph("General Information:", styleHeading3)) infoTableData = [ [ Paragraph('<b>- Name: </b>' + calibrationData['txtBldgName'], styleBodyText), Paragraph('<b>- Address: </b>' + calibrationData['txtBldgAddress'], styleBodyText), Paragraph('<b>- Type: </b>' + calibrationData['cmbBldgType'], styleBodyText) ], [ Paragraph( '<b>- Location: </b>' + calibrationData['cmbBldgLocation'], styleBodyText), Paragraph('<b>- Shape: </b>' + calibrationData['cmbBldgShape'], styleBodyText), Paragraph( '<b>- Floor Area (m' + u"\u00b2" + '): </b>' + str(calibrationData['txtFloorArea']), styleBodyText) ] ] infoTable = Table(infoTableData, colWidths=[160, 165, 150], rowHeights=rowHeights) Elements.append(infoTable) Elements.append(Paragraph('<br />', styleBodyText)) Elements.append(Paragraph("Envelope Construction Details:", styleHeading3)) envTableData = [ [ Paragraph( '<b>- South Wall: </b>' + calibrationData['cmbSouthWall'], styleBodyText), Paragraph('<b>- West Wall: </b>' + calibrationData['cmbWestWall'], styleBodyText) ], [ Paragraph( '<b>- North Wall: </b>' + calibrationData['cmbNorthWall'], styleBodyText), Paragraph('<b>- East Wall: </b>' + calibrationData['cmbEastWall'], styleBodyText) ], [ Paragraph('<b>- Roof: </b>' + calibrationData['cmbRoof'], styleBodyText), Paragraph( '<b>- Floor: </b>' + calibrationData['cmbFirstFloorContact'], styleBodyText) ], [ Paragraph('<b>- Windows Type: </b>' + calibrationData['glasstype'], styleBodyText), Paragraph( '<b>- Overhang Depth (m): </b>' + str(calibrationData['txtWinSouthOverhang']), styleBodyText) ] ] envTable = Table(envTableData, colWidths=[240, 235], rowHeights=rowHeights) Elements.append(envTable) Elements.append(Paragraph('<br />', styleBodyText)) Elements.append(Paragraph("Air Conditioning Systems", styleHeading3)) hvacTableData = [[ Paragraph( '<b>- HVAC System Type: </b>' + calibrationData['cmbBldgSystem'], styleBodyText), Paragraph( '<b>- Cooling Temperature Setting (' + u"\u00b0" + 'C): </b>' + str(calibrationData['txtCoolSetTemp']), styleBodyText) ], [ Paragraph( '<b>- Energy Efficiency Ratio (EER): </b>' + str(calibrationData['eir']), styleBodyText), Paragraph( '<b>- Heating Temperature Setting (' + u"\u00b0" + 'C): </b>' + str(calibrationData['txtHeatSetTemp']), styleBodyText) ]] hvacTable = Table(hvacTableData, colWidths=[240, 235], rowHeights=rowHeights) Elements.append(hvacTable) Elements.append(Paragraph('<br />', styleBodyText)) Elements.append(Paragraph("Overall Assessment", styleHeading)) Elements.append( Paragraph( "Based on your description and current SASO requirements, the tool provides the following assessments:", styleBodyText)) if task['compliant']: compliant = "<strong><font color=green>meets</font></strong>" else: compliant = "<strong><font color=red>does not meet</font></strong>" if (task['ngEnergyDiff'] < 0): energyDiff = "<strong><font color=green>" + str( task['energyDiff']) + " kWh/year, less</font></strong>" else: energyDiff = "<strong><font color=red>" + str( task['energyDiff']) + " kWh/year, more</font></strong>" Elements.append( Paragraph( "- Your building " + compliant + " SASO requirements for all building envelope", styleBodyText)) Elements.append( Paragraph( "- Your building consumed " + energyDiff + " than the SASO Baseline", styleBodyText)) if task['compliant']: Elements.append( Paragraph( "- You may reduce even more your energy consumption in your building by using LED lamps and high efficient appliances and air conditioning system", styleBodyText)) else: Elements.append( Paragraph( " - You need to add more insulation to the walls and/or roof, or use more efficient window glazing to comply with SASO requirements", styleBodyText)) if not task['compliant'] and (task['ngEnergyDiff'] >= 0): Elements.append( Paragraph( " - You may also consider using LED lamps and energy efficient appliances and air conditioning system", styleBodyText)) Elements.append(PageBreak()) Elements.append( Paragraph("How electricity is used in your building?", styleHeading3)) Elements.append( Paragraph( "Your building needs electricity to operate several types of equipment including: air-conditioning, lighting, appliances and domestic hot water.", styleBodyText)) #add image Elements.append( Image('static/img/results-intro.png', width=4 * inch, height=1.2 * inch)) #add text Elements.append( Paragraph( "Based on the description you provided as well as typical lighting and appliances used in households, here how your building consumes electricity on annual basis:", styleBodyText)) bepuPieData = task['bepuPieData'] bepuTableData = [[0 for i in xrange(len(bepuPieData[0]))] for i in xrange(len(bepuPieData) + 1)] bepuChartLabel = [0 for i in xrange(len(bepuPieData))] bepuChartData = [0 for i in xrange(len(bepuPieData))] bepuTableData[0][0] = 'End-Use' bepuTableData[0][1] = 'Annual Electricity Use' for i, result in enumerate(bepuPieData): # write body cells bepuTableData[i + 1][0] = str(result['label']) bepuTableData[i + 1][1] = int(result['value']) bepuChartLabel[i] = str(result['label']) bepuChartData[i] = result['value'] #add chart bepuChart = Drawing(400, 200) pc = Pie() pc.data = bepuChartData labelc = [0 for i in xrange(len(bepuChartData))] for i, r in enumerate(bepuChartData): labelc[i] = str(round(r / sum(bepuChartData) * 100, 1)) + "%" pc.labels = labelc pc._seriesCount = len(bepuChartLabel) pc.slices.strokeColor = colors.HexColor(0xffffff) pc.slices.strokeWidth = 0.5 bepu_chart_colors = ['#FFC43E', '#A4A4A4', '#F67A40', '#5894D0', '#98cd99'] for i, r in enumerate(bepuChartLabel): pc.slices[i].fillColor = colors.HexColor(bepu_chart_colors[i]) pc.width = pc.height = 120 pc.x = 40 pc.y = 30 # add_legend(d, pc) legend = Legend() legend.alignment = 'right' legend.x = pc.width + pc.x + 80 legend.y = pc.height - 10 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fillColor = colors.HexColor(0x807F83) legend.fontSize = 10 legend.boxAnchor = 'nw' legend.columnMaximum = 8 legend.strokeWidth = 0.5 legend.strokeColor = colors.HexColor(0xffffff) legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 10 legend.yGap = 0 legend.dxTextSpace = 5 legend.dividerLines = 1 | 2 | 4 legend.dividerOffsY = 6 legend.subCols.rpad = 70 legend.dividerColor = colors.HexColor(0xdedede) legend.colorNamePairs = [(pc.slices[i].fillColor, (bepuChartLabel[i][0:20], ' %s ' % "{:,}".format(int(pc.data[i])))) for i in xrange(len(pc.data))] legendHeader = Legend() legendHeader.colorNamePairs = [ ('', ('End-Use', 'Annual Electricity Use\n(kWh/year)')) ] legendHeader.alignment = 'right' legendHeader.x = legend.x - 20 legendHeader.y = legend.y + 30 legendHeader.fontName = 'Helvetica' legendHeader.fillColor = colors.HexColor(0x807F83) legendHeader.fontSize = 10 legendHeader.boxAnchor = 'nw' legendHeader.subCols.rpad = 80 legendFooter = Legend() legendFooter.colorNamePairs = [ ('', ('Total', str("{:,}".format(int(sum(bepuChartData)))) + '')) ] legendFooter.alignment = 'right' legendFooter.x = legendHeader.x + 5 legendFooter.y = legend.y - (len(bepuChartLabel) + 1) * 10 legendFooter.fontName = 'Helvetica-Bold' legendFooter.fillColor = colors.HexColor(0x807F83) legendFooter.fontSize = 10 legendFooter.boxAnchor = 'nw' legendFooter.subCols.rpad = 145 bepuChart.add(legend) bepuChart.add(legendHeader) bepuChart.add(legendFooter) pc.slices.fontColor = colors.HexColor(0x807F83) n = len(pc.data) bepuChart.add(pc, '') Elements.append(bepuChart) ## PAGE 2 Elements.append( Paragraph("When electricity is consumed in your building?", styleHeading3)) Elements.append( Paragraph( "Based on the weather of your location as well as typical lighting and appliances used in households, your building consumes electricity as noted in the following monthly profile:", styleBodyText)) #add chart pseBarData = task['pseBarData'] pseTableData = [[0 for i in xrange(len(pseBarData[0]['values']) + 1)] for i in xrange(len(pseBarData) + 1)] pseChartData = [[0 for i in xrange(len(pseBarData[0]['values']))] for i in xrange(len(pseBarData))] pseChartLegend = [0 for i in xrange(len(pseBarData))] pseTableData[0][0] = 'Key' month = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] for i, m in enumerate(month): pseTableData[0][i + 1] = str(month[i]) for i, result in enumerate(pseBarData): # write body cells pseTableData[i + 1][0] = str(result['key']) pseChartLegend[i] = str(result['key']) for j, value in enumerate(result['values']): pseTableData[i + 1][j + 1] = int(result['values'][j]['y']) pseChartData[i][j] = int(result['values'][j]['y']) pseChart = Drawing(400, 200) bc = VerticalBarChart() bc.x = 70 bc.y = 0 bc.height = 200 bc.width = 300 bc.data = pseChartData bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.strokeWidth = 0 bc.valueAxis.valueMin = 0 bc.categoryAxis.style = 'stacked' bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 10 bc.categoryAxis.labels.dy = -2 bc.valueAxis.labels.fontName = 'Helvetica' bc.valueAxis.labels.fontSize = 10 bc.valueAxis.strokeWidth = 0.5 bc.valueAxis.strokeColor = colors.HexColor(0x807F83) bc.categoryAxis.strokeWidth = 0.5 bc.categoryAxis.strokeColor = colors.HexColor(0x807F83) bc.valueAxis.labels.fillColor = colors.HexColor(0x807F83) bc.categoryAxis.labels.fontName = 'Helvetica' bc.categoryAxis.labels.fontSize = 10 bc.categoryAxis.labels.fillColor = colors.HexColor(0x807F83) bc.categoryAxis.categoryNames = month # create a list and add the elements of our document (image, paragraphs, table, chart) to it #add our barchart and legend bc.barWidth = .3 * inch bc.groupSpacing = .2 * inch bc.bars.strokeColor = colors.HexColor(0xffffff) bc.bars.strokeWidth = 0. pse_chart_colors = ['#FFC43E', '#A4A4A4', '#F67A40', '#5894D0'] for i, r in enumerate(pseChartLegend): bc.bars[i].fillColor = colors.HexColor(pse_chart_colors[i]) # = colors.blue legend = Legend() legend.alignment = 'right' legend.x = bc.width + bc.x + 5 legend.y = bc.height + bc.y legend.deltax = 40 legend.dxTextSpace = 5 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fillColor = colors.HexColor(0x807F83) legend.fontSize = 10 legend.boxAnchor = 'nw' legend.columnMaximum = (len(bc.data) + 1) / 2 legend.strokeWidth = 0.5 legend.strokeColor = colors.HexColor(0xffffff) legend.deltax = 75 legend.deltay = 12 legend.dividerColor = colors.HexColor(0xdedede) legend.columnMaximum = len(pseChartLegend) legend.colorNamePairs = [(bc.bars[i].fillColor, pseChartLegend[i]) for i in xrange(len(bc.data))] #pseChart.hAlign = 'RIGHT' label = Label() label.setOrigin(10, bc.height / 2) #label.boxAnchor = 'sw' label.angle = 90 label.fillColor = colors.HexColor(0x807F83) label.setText('Electricity Consumption (kWh)') label.fontName = 'Helvetica' pseChart.add(legend, 'legend') pseChart.add(bc) pseChart.add(label) Elements.append(pseChart) Elements.append(PageBreak()) ## PAGE 3 Elements.append( Paragraph( "Does your building meet SASO Thermal Performance Requirements?", styleHeading3)) Elements.append( Paragraph( "Based on your description, the thermal transmittance properties of the walls, roof and glazing are calculated, and compared with SASO thermal building performance requirements:", styleBodyText)) #add chart lvdData = task['lvdData'] lvdChartData = [[0 for i in xrange(len(lvdData[0]['values']))] for i in xrange(len(lvdData))] lvdChartCategoryNames = [0 for i in xrange(len(lvdData[0]['values']))] lvdComparedObjKey = [0 for i in xrange(len(lvdData))] for i, result in enumerate(lvdData): # write body cells lvdComparedObjKey[i] = str(lvdData[i]['key']) for j, value in enumerate(result['values']): lvdChartCategoryNames[j] = value['label'] lvdChartData[i][j] = value['value'] lvdChart = Drawing(400, 200) bc = VerticalBarChart() bc.x = 70 bc.y = 0 bc.height = 200 bc.width = 300 bc.data = lvdChartData bc.strokeColor = colors.black # bc.fillColor=colors.blue bc.valueAxis.valueMin = 0 bc.strokeWidth = 0 bc.valueAxis.valueMin = 0 bc.categoryAxis.labels.boxAnchor = 'n' bc.categoryAxis.labels.dx = 0 bc.categoryAxis.labels.dy = -2 # bc.categoryAxis.labels.angle = 20 bc.valueAxis.labels.fontName = 'Helvetica' bc.valueAxis.labels.fontSize = 10 bc.valueAxis.strokeWidth = 0.5 bc.valueAxis.strokeColor = colors.HexColor(0x807F83) bc.categoryAxis.strokeWidth = 0.5 bc.categoryAxis.strokeColor = colors.HexColor(0x807F83) bc.valueAxis.labels.fillColor = colors.HexColor(0x807F83) bc.categoryAxis.labels.fontName = 'Helvetica' bc.categoryAxis.labels.fontSize = 8 bc.categoryAxis.labels.fillColor = colors.HexColor(0x807F83) bc.categoryAxis.categoryNames = lvdChartCategoryNames bc.categoryAxis.labels.angle = 0 # create a list and add the elements of our document (image, paragraphs, table, chart) to it #add our barchart and legend bc.barWidth = .3 * inch bc.groupSpacing = .2 * inch bc.bars.strokeColor = colors.HexColor(0xffffff) bc.bars.strokeWidth = 0.5 lvd_chart_colors = ['#5894D0', '#F67A40'] for i, r in enumerate(lvdComparedObjKey): bc.bars[i].fillColor = colors.HexColor(lvd_chart_colors[i]) # = colors.blue legend = Legend() legend.alignment = 'right' legend.x = bc.width + bc.x + 5 legend.y = bc.height + bc.y legend.deltax = 40 legend.dxTextSpace = 5 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fillColor = colors.HexColor(0x807F83) legend.fontSize = 10 legend.boxAnchor = 'nw' legend.columnMaximum = (len(bc.data) + 1) / 2 legend.strokeWidth = 0.5 legend.strokeColor = colors.HexColor(0xffffff) legend.deltax = 75 legend.deltay = 12 legend.dividerColor = colors.HexColor(0xdedede) legend.columnMaximum = len(lvdComparedObjKey) legend.colorNamePairs = [(bc.bars[i].fillColor, lvdComparedObjKey[i]) for i in xrange(len(bc.data))] #pseChart.hAlign = 'RIGHT' label = Label() label.setOrigin(10, bc.height / 2) #label.boxAnchor = 'sw' label.angle = 90 label.fillColor = colors.HexColor(0x807F83) label.setText('Envelope U-value (W/m' + u'\u00b2' + '.k)') label.fontName = 'Helvetica' lvdChart.add(label) lvdChart.add(legend, 'legend') lvdChart.add(bc) Elements.append(lvdChart) #Elements.append(PageBreak()) Elements.append(Paragraph('<br /><br />', styleBodyText)) ## PAGE 4 Elements.append( Paragraph("How energy efficient is your building?", styleHeading3)) Elements.append( Paragraph( "Using your input specifications, the annual electricity consumption is calculated and compared with a similar building that meets SASO requirements:", styleBodyText)) #add chart bepuComparisonData = task['bepuComparisonData'] bepuComparisonChartData = [[ 0 for i in xrange(len(bepuComparisonData[0]['values'])) ] for i in xrange(len(bepuComparisonData))] bepuChartCategoryNames = [ 0 for i in xrange(len(bepuComparisonData[0]['values'])) ] bepuComparedObjKey = [0 for i in xrange(len(bepuComparisonData))] for i, result in enumerate(bepuComparisonData): # write body cells bepuComparedObjKey[i] = str(bepuComparisonData[i]['key']) for j, value in enumerate(result['values']): bepuChartCategoryNames[j] = value['label'] bepuComparisonChartData[i][j] = value['value'] bepuComparisonChart = Drawing(400, 200) bc = VerticalBarChart() bc.x = 70 bc.y = 0 bc.height = 200 bc.width = 300 bc.data = bepuComparisonChartData bc.strokeColor = colors.black # bc.fillColor=colors.blue bc.valueAxis.valueMin = 0 bc.strokeWidth = 0 bc.valueAxis.valueMin = 0 bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 10 bc.categoryAxis.labels.dy = -2 # bc.categoryAxis.labels.angle = 20 bc.valueAxis.labels.fontName = 'Helvetica' bc.valueAxis.labels.fontSize = 10 bc.valueAxis.strokeWidth = 0.5 bc.valueAxis.strokeColor = colors.HexColor(0x807F83) bc.categoryAxis.strokeWidth = 0.5 bc.categoryAxis.strokeColor = colors.HexColor(0x807F83) bc.valueAxis.labels.fillColor = colors.HexColor(0x807F83) bc.categoryAxis.labels.fontName = 'Helvetica' bc.categoryAxis.labels.fontSize = 10 bc.categoryAxis.labels.fillColor = colors.HexColor(0x807F83) bc.categoryAxis.categoryNames = bepuChartCategoryNames bc.categoryAxis.labels.angle = 30 # create a list and add the elements of our document (image, paragraphs, table, chart) to it #add our barchart and legend bc.barWidth = .3 * inch bc.groupSpacing = .2 * inch bc.bars.strokeColor = colors.HexColor(0xffffff) bc.bars.strokeWidth = 0.5 bepu_chart_colors = ['#5894D0', '#F67A40'] for i, r in enumerate(bepuComparedObjKey): bc.bars[i].fillColor = colors.HexColor(bepu_chart_colors[i]) # = colors.blue # bc.bars[1].fillColor = colors.lightblue legend = Legend() legend.alignment = 'right' legend.x = bc.width + bc.x + 5 legend.y = bc.height + bc.y legend.deltax = 40 legend.dxTextSpace = 5 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fillColor = colors.HexColor(0x807F83) legend.fontSize = 10 legend.boxAnchor = 'nw' legend.columnMaximum = (len(bc.data) + 1) / 2 legend.strokeWidth = 0.5 legend.strokeColor = colors.HexColor(0xffffff) legend.deltax = 75 legend.deltay = 12 legend.dividerColor = colors.HexColor(0xdedede) legend.columnMaximum = len(bepuComparedObjKey) legend.colorNamePairs = [(bc.bars[i].fillColor, bepuComparedObjKey[i]) for i in xrange(len(bc.data))] #pseChart.hAlign = 'RIGHT' label = Label() label.setOrigin(10, bc.height / 2) #label.boxAnchor = 'sw' label.angle = 90 label.fillColor = colors.HexColor(0x807F83) label.setText('Annual Energy Use (kWh/year)') label.fontName = 'Helvetica' bepuComparisonChart.add(label) bepuComparisonChart.add(legend, 'legend') bepuComparisonChart.add(bc) Elements.append(bepuComparisonChart) Elements.append(PageBreak()) doc.build(Elements) output_file.seek(0) # Set filname and mimetype file_name = 'K-BEAT_export_{}.pdf'.format( datetime.now().strftime("%Y-%m-%d %H:%M:%S")) #Returning the file from memory return send_file(output_file, attachment_filename=file_name, as_attachment=True)
def createBarGraph(c, x, y, data, labels, colors, barnames, minvalue, maxvalue, step, h=75, w=300, dy=0): """ Function to draw a Bar Graph """ drawing = Drawing(400, 200) legend = Legend() legend.columnMaximum = 99 legend.alignment = 'right' legend.dx = 7 legend.dy = 7 legend.dxTextSpace = 5 legend.deltay = 10 legend.strokeWidth = 0 legend.strokeColor = HexColor("0xffffff") legend.subCols[0].minWidth = 75 legend.subCols[0].align = 'left' legend.boxAnchor = 'c' legend.y = h + 25 legend.x = w + 110 legend.fontName = "MavenPro" legend.fontSize = 8.5 legendList = [] for k, i in enumerate(colors): legendList.append((HexColor(i), barnames[k])) legend.colorNamePairs = legendList bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = h # 75 bc.width = w # 300 bc.data = data bc.bars.strokeColor = HexColor("0xffffff") bc.valueAxis.labels.fontName = "MavenPro" bc.valueAxis.labels.fontSize = 8 bc.valueAxis.labels.dx = -10 bc.valueAxis.valueMin = minvalue bc.valueAxis.valueMax = maxvalue bc.valueAxis.valueStep = step bc.categoryAxis.labels.boxAnchor = 'n' bc.categoryAxis.labels.dx = 0 bc.categoryAxis.labels.dy = -10 - dy bc.categoryAxis.labels.angle = 0 bc.categoryAxis.labels.fontName = "MavenPro" bc.categoryAxis.labels.fontSize = 8 bc.categoryAxis.categoryNames = labels for k in xrange(len(colors)): bc.bars[k].fillColor = HexColor(colors[k]) #self.chart.bars[k].fillColor = HexColor(colors[k]) drawing.add(bc) drawing.add(legend, 'legend') drawing.drawOn(c, x, y)
def generarGraficoProductos(self): nombres = [] precios = [] self.iniciar_conexion() cursor = self.__conexion.cursor() sql = "SELECT prod.nombre,SUM(prod.precio) AS precio_final FROM productos prod,proveedores prov WHERE prod.id_proveedor=prov.id GROUP BY prod.nombre" cursor.execute(sql) rows = cursor.fetchall() for row in rows: nombre_producto = row[0] precio = row[1] nombres.append(nombre_producto) precios.append(precio) self.cerrar_conexion() reporte = SimpleDocTemplate("graficoProductos.pdf") partes = [] font_text = ParagraphStyle("test") font_text.textColor = "black" font_text.alignment = TA_CENTER font_text.fontSize = 20 text = Paragraph("Reporte gráfico de productos y sus precios", font_text) partes.append(text) draw = Drawing() pie = Pie() pie.width = 300 pie.height = 200 pie.x = 50 pie.y = -100 pie.data = precios pie.labels = nombres pie.slices.strokeWidth = 0.5 legend = Legend() legend.x = 250 legend.y = -200 legend.dx = 8 legend.dy = 8 legend.fontName = "Helvetica" legend.fontSize = 7 legend.boxAnchor = "n" legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = colors.black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = "right" legend.dividerLines = 1 | 2 | 4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 legend.colorNamePairs = [(pie.slices[i].fillColor, (pie.labels[i][0:20], "$" + "%0.2f" % pie.data[i])) for i in xrange(len(pie.data))] draw.add(legend) draw.add(pie) partes.append(draw) reporte.build(partes) if (os.path.isfile("graficoProductos.pdf")): return True else: return False
def grafica_pastel(request): response = HttpResponse(content_type='application/pdf') pdf_name = "Gráfica.pdf" # llamado clientes # la linea 26 es por si deseas descargar el pdf a tu computadora response['Content-Disposition'] = 'attachment; filename=%s' % pdf_name buff = BytesIO() doc = SimpleDocTemplate( buff, pagesize=letter, rightMargin=40, leftMargin=40, topMargin=200, bottomMargin=18, ) story = [] estilo = getSampleStyleSheet() d = Drawing(300, 200) pc = Pie() pc.x = 65 pc.y = 15 pc.width = 170 pc.height = 170 # pc.data = [11,20,30,40,50] # pc.labels = ['IE','Kopete','Chrome','Firefox','Opera'] datos = [] etiquetas = [] for key in Venta.objects.values('producto').annotate( suma=Sum('cantidad_vendida')): producto = get_object_or_404(Producto, pk=key['producto']) etiquetas.append(producto.nombre) datos.append(key['suma']) pc.data = datos pc.labels = etiquetas pc.slices.strokeWidth = 0.5 pc.slices[3].popout = 10 pc.slices[3].strokeWidth = 2 pc.slices[3].strokeDashArray = [2, 2] pc.slices[3].labelRadius = 1.75 pc.slices[3].fontColor = colors.red pc.sideLabels = 1 # Con 0 no se muestran lÌneas hacia las etiquetas #~ pc.slices.labelRadius = 0.65 # Para mostrar el texto dentro de las tajadas #Insertamos la legenda legend = Legend() legend.x = 370 legend.y = 0 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fontSize = 7 legend.boxAnchor = 'n' legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = colors.black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = 'right' legend.dividerLines = 1 | 2 | 4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 #Insertemos nuestros propios colores colores = [ colors.blue, colors.red, colors.green, colors.yellow, colors.pink ] for i, color in enumerate(colores): pc.slices[i].fillColor = color legend.colorNamePairs = [(pc.slices[i].fillColor, (pc.labels[i][0:20], '%0.2f' % pc.data[i])) for i in xrange(len(pc.data))] d.add(pc) d.add(legend) story.append(d) doc.build(story) response.write(buff.getvalue()) buff.close() return response
def __get_tags_statistics(self): monto_categorias = dict() for tra in self.transactions: if len(tra.tags) > 0: for tag in tra.tags: if tag in monto_categorias.keys(): monto_categorias[tag] += tra.amount else: monto_categorias[tag] = tra.amount labels = [lab.encode('utf-8') for lab in monto_categorias.keys()] data = monto_categorias.values() p = PageBreak() p.drawOn(self.c, 0, 1000) self.c.showPage() self.l = 600 self.c.setFont('Courier', 14) self.c.drawString(30, 800, 'Categorias') drawing = Drawing(200, 200) pie = Pie() pie.x = 30 pie.y = self.l - 130 pie.height = 300 pie.width = 300 pie.data = data pie.labels = labels pie.simpleLabels = 1 pie.slices.strokeWidth = 1 pie.slices.strokeColor = black pie.slices.label_visible = 0 legend = Legend() legend.x = 400 legend.y = self.l legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fontSize = 7 legend.boxAnchor = 'w' legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = 'right' legend.dividerLines = 1|2|4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 n = len(pie.data) self.__setItems(n,pie.slices, 'fillColor',self.pdf_chart_colors) legend.colorNamePairs = [(pie.slices[i].fillColor, (pie.labels[i][0:20],'$%0.2f' % pie.data[i])) for i in xrange(n)] drawing.add(pie) drawing.add(legend) x, y = 0, 10 renderPDF.draw(drawing, self.c, x, y, showBoundary=False)
def __per_account_statistic(self): for acc in self.accounts: p = PageBreak() p.drawOn(self.c, 0, 1000) self.c.showPage() self.l = 760 self.c.setFont('Courier', 14) self.c.drawString(30, 800, 'Cuenta: %s' % \ acc.name) header = ['Fecha', 'Tipo', 'Monto', 'Description'] data = [header] g_data = list() g_labe = list() total = 0 for tra in self.transactions: if tra.account == acc.name: if tra.t_type in ['expense', 'transfer']: tipo = self.__translate_type(tra.t_type) data.append([tra.date, tipo.upper(), '$%2.f' % tra.amount, tra.description]) total += tra.amount g_data.append(tra.amount) g_labe.append(tra.description.encode('utf-8')) data.append(['TOTAL', '', '$%.2f' % total, '']) if len(g_data) == 0 or len(g_labe) == 0: self.c.setFont('Courier', 12) self.c.drawString(30, 770, 'Sin movimientos negativos') continue from_title = 35 if len(data) != 2: self.l -= ((len(data) * len(data)) + len(data)) + from_title t = Table(data) t.setStyle(TableStyle([('INNERGRID', (0,0), (-1,-1), 0.25, black), ('BOX', (0,0), (-1,-1), 0.25, black), ('FONTNAME', (0,0), (-1,0), 'Courier-Bold'), ('BACKGROUND', (0,0), (-1,0), HexColor('#efeded')), ('BACKGROUND', (0,0), (0,-1), HexColor('#efeded')), ('FONTSIZE', (0,0), (-1,0), 12), ('FONTSIZE', (0,1), (-1,-1), 8), ('FONTNAME', (0,1), (-1,-1), 'Courier'), ('BACKGROUND', (0,-1), (-1,-1), red), ('TEXTCOLOR', (0,-1), (-1,-1), white)])) t.wrapOn(self.c, 30, self.l) t.drawOn(self.c, 30, self.l) drawing = Drawing(200, 100) pie = Pie() pie.x = 30 pie.y = self.l - 300 pie.height = 200 pie.width = 200 pie.data = g_data pie.labels = g_labe pie.simpleLabels = 1 pie.slices.strokeWidth = 1 pie.slices.strokeColor = black pie.slices.label_visible = 0 pie.slices.popout = 1 #pie.labels = map(str, pie.data) legend = Legend() legend.x = 250 legend.y = self.l - 250 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fontSize = 7 legend.boxAnchor = 'w' legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = 'right' legend.dividerLines = 1|2|4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 n = len(pie.data) self.__setItems(n,pie.slices, 'fillColor',self.pdf_chart_colors) legend.colorNamePairs = [(pie.slices[i].fillColor, (pie.labels[i][0:20],'$%0.2f' % pie.data[i])) for i in xrange(n)] drawing.add(pie) drawing.add(legend) x, y = 0, 10 renderPDF.draw(drawing, self.c, x, y, showBoundary=False)
def xerar_pieChart_serv(self): """ Xera unha gráfica circular co número de empregados por servizo, obtidos da base de datos :return: """ from reportlab.graphics.charts.piecharts import Pie from reportlab.graphics.charts.legends import Legend styles = getSampleStyleSheet() ptext = Paragraph('Número de empregados por tipo de servizo:', styles['Heading1']) self.story.append(ptext) d = Drawing(300, 200) pc = Pie() pc.x = 65 pc.y = 12 pc.width = 170 pc.height = 170 pc.labels = [ 'Mantemento', 'Administración', 'Investigación de mercados', 'Contabilidade', 'Programación', 'Vendas', 'Soporte técnico', 'Desarrollo', 'Distribución', 'Dirección de empresas', 'Recursos humanos' ] pc.data = [ row for row in self.cursor.execute( """SELECT (SELECT nempregados FROM servizos WHERE (nom_serv = 'mantemento')) AS man, (SELECT nempregados FROM servizos WHERE (nom_serv = 'administracion')) AS adm, (SELECT nempregados FROM servizos WHERE (nom_serv = 'investigacion de mercados')) AS inv, (SELECT nempregados FROM servizos WHERE (nom_serv = 'contabilidade')) AS cont, (SELECT nempregados FROM servizos WHERE (nom_serv = 'programacion')) AS prog, (SELECT nempregados FROM servizos WHERE (nom_serv = 'vendas')) AS vendas, (SELECT nempregados FROM servizos WHERE (nom_serv = 'soporte tecnico')) AS sop, (SELECT nempregados FROM servizos WHERE (nom_serv = 'desarrollo')) AS des, (SELECT nempregados FROM servizos WHERE (nom_serv = 'distribucion')) AS dist, (SELECT nempregados FROM servizos WHERE (nom_serv = 'direccion de empresas')) AS dir, (SELECT nempregados FROM servizos WHERE (nom_serv = 'recursos humanos')) FROM servizos AS rh """).fetchone() ] pc.slices.strokeWidth = 0.5 pc.slices[2].popout = 10 pc.slices[2].strokeWidth = 2 pc.slices[2].strokeDashArray = [2, 2] pc.slices[2].labelRadius = 1.75 pc.slices[2].fontColor = colors.purple pc.sideLabels = 1 # Con 0 no se muestran líneas hacia las etiquetas # Insertamos la leyenda legend = Legend() legend.x = 370 legend.y = 0 legend.dx = 8 legend.dy = 8 legend.fontName = 'Helvetica' legend.fontSize = 7 legend.boxAnchor = 'n' legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = colors.black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = 'right' legend.dividerLines = 1 | 2 | 4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 # Insertemos nuestros propios colores colores = [ colors.darkblue, colors.cyan, colors.purple, colors.magenta, colors.pink, colors.lightgreen, colors.coral, colors.crimson, colors.darkgreen, colors.darkorange, colors.lavender ] for i, color in enumerate(colores): pc.slices[i].fillColor = color legend.colorNamePairs = [(pc.slices[i].fillColor, (pc.labels[i][0:20], '%0.2f' % pc.data[i])) for i in range(len(pc.data))] d.add(pc) d.add(legend) self.story.append(d) self.story.append(Spacer(0, 110))
def generar_pdf_busquedas_view(request): print "Genero el PDF" fecha_m = "" resultados=[] fecha_a = "" b=[] t=[] fecha_inicio = x fecha_final = y c=0 r=[] #story =[] response = HttpResponse(content_type='application/pdf') pdf_name = "reporte_busqueda.pdf" # llamado clientes # la linea 26 es por si deseas descargar el pdf a tu computadora response['Content-Disposition'] = 'attachment; filename=%s' % pdf_name buff = BytesIO() doc = SimpleDocTemplate(buff, pagesize=letter, rightMargin=40, leftMargin=40, topMargin=60, bottomMargin=18, ) reportes = [] styles = getSampleStyleSheet() fichero_imagen="biblioteca/media/images/Reports-banner.jpg" imagen_logo=Image(os.path.realpath(fichero_imagen),width=400,height=100) reportes.append(imagen_logo) header = Paragraph("Fecha del reporte: "+str(date.today()), styles['Heading1']) header2 = Paragraph("Reporte de las busquedas realizadas entre la fecha "+str(fecha_inicio)+" hasta la fecha "+str(fecha_final) + "\n", styles['Normal']) salto_linea = Paragraph("\n\n", styles["Normal"]) reportes.append(header) reportes.append(header2) reportes.append(Spacer(1, 12)) headings = ('Busqueda', 'Resultado',)# 'Cantidad_Veces_Buscadas') lista=[] t = Busqueda.objects.all() b = Busqueda.objects.filter(fecha__range=(fecha_inicio, fecha_final)).values('busqueda', 'resultados').distinct() listar=[] for r in b: print "llllllllllllllllll",r,"\n" if r['resultados'] == False: r['resultados']="No se encontró" listar.append(r) else: r['resultados']="Se encontró" listar.append(r) print "lisygyujgyjgjhbjh", listar #GRAFICAS BARRA total_busquedas=Busqueda.objects.all().count() #TOTAL BUSQUEDAS si=Busqueda.objects.filter(resultados=True).count() #BUSUEDAS ENCONTRADAS (SI) no=total_busquedas-si #BUSQUEDAS NO ENCONTRADAS (NO) #GRAFICAS PASTEL for i in b: print "________________",i.get("busqueda") for j in t: print "===============",j.busqueda if j.busqueda == i.get("busqueda") and j.fecha >= fecha_inicio and j.fecha <= fecha_final: c = c + 1 print c lista.append(c) c=0 print lista , len(lista) li = zip(b,lista) ''' for i in b: print "________________",i.get("busqueda") for j in t: print "===============",j.busqueda if j.busqueda == i.get("busqueda"): c = c + 1 print c lista.append(c) c=0 li = zip(b,lista) ''' #allreportes = [ (i.busqueda, i.resultados) for i in Busqueda.objects.filter(fecha__range=(fecha_inicio, fecha_final)).values('busqueda', 'resultados').distinct()] # allreportes = [ i.values() for i in Busqueda.objects.filter(fecha__range=(fecha_inicio, fecha_final)).values('busqueda', 'resultados').distinct()] b=listar allreportes = [ i.values() for i in b] print allreportes t = Table([headings] + allreportes) t.setStyle(TableStyle( [ ('GRID', (0, 0), (3, -1), 1, colors.dodgerblue), ('LINEBELOW', (0, 0), (-1, 0), 2, colors.darkblue), ('BACKGROUND', (0, 0), (-1, 0), colors.dodgerblue) ] )) #GRAFICA DE BARRAS titulo = Paragraph("Busquedas encontradas y no encontradas en el sistema", estilo['title']) drawing = Drawing(400, 200) data = [(si, no)] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.bars[0].fillColor = colors.blue bc.bars[1].fillColor = colors.black bc.strokeColor = colors.black bc.fillColor = colors.silver bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = total_busquedas+30 try: r = total_busquedas/2 if type(r) == 'float': bc.valueAxis.valueStep = total_busquedas+0.5 if type(r) == 'int': bc.valueAxis.valueStep = r except: "Nos se puede" bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 0 bc.categoryAxis.categoryNames = ['Encontradas', 'No Encontradas'] drawing.add(bc) bc.barLabels.nudge = 20 bc.barLabelFormat = '%0.0f' bc.barLabels.dx = 0 bc.barLabels.dy = 0 bc.barLabels.boxAnchor = 'n' # irrelevant (becomes 'c') bc.barLabels.fontName = 'Helvetica' bc.barLabels.fontSize = 14 #GRAFICAS DE PASTEL titulo2 = Paragraph("Busquedas y número de veces realizadas", estilo['title']) d = Drawing(400, 200) pc = Pie() pc.x = 125 pc.y = 25 pc.data = lista print lista #pc.data = [7, 1, 1, 1, 1, 2] #pc.labels = [ str(i.values()) for i in Busqueda.objects.filter(fecha__range=(fecha_inicio, fecha_final)).values('busqueda').distinct()] lista_labels = [ str(i.values()) for i in Busqueda.objects.filter(fecha__range=(fecha_inicio, fecha_final)).values('busqueda').distinct()] #pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6'] pc.sideLabels = 1 pc.width = 150 pc.height = 150 pc.slices.strokeWidth=1#0.5 pc.slices[0].fillColor = colors.yellow pc.slices[1].fillColor = colors.thistle pc.slices[2].fillColor = colors.cornflower pc.slices[3].fillColor = colors.lightsteelblue pc.slices[4].fillColor = colors.aquamarine pc.slices[5].fillColor = colors.cadetblue d.add(pc) legend = Legend() legend.x = 370 legend.y = 0 legend.dx = 10 legend.dy = 10 legend.fontName = 'Helvetica' legend.fontSize = 10 legend.boxAnchor = 'n' legend.columnMaximum = 10 legend.strokeWidth = 1 legend.strokeColor = colors.black legend.deltax = 75 legend.deltay = 10 legend.autoXPadding = 5 legend.yGap = 0 legend.dxTextSpace = 5 legend.alignment = 'right' legend.dividerLines = 1|2|4 legend.dividerOffsY = 4.5 legend.subCols.rpad = 30 #Insertemos nuestros propios colores colores = [colors.blue, colors.red, colors.green, colors.yellow, colors.black, colors.white, colors.silver, colors.pink, colors.brown, colors.orange, colors.purple] for i, color in enumerate(colores): pc.slices[i].fillColor = color legend.colorNamePairs = [( pc.slices[i].fillColor, (lista_labels[i][0:200], '%0.0f' % pc.data[i]) ) for i in xrange(len(pc.data))] d.add(pc) reportes.append(t) reportes.append(Spacer(0, inch*.1)) reportes.append(Spacer(0, inch*.1)) reportes.append(Spacer(0, inch*.1)) reportes.append(titulo) reportes.append(drawing) reportes.append(Spacer(0, inch*.1)) reportes.append(Spacer(0, inch*.1)) reportes.append(titulo2) d.add(legend) reportes.append(d) doc.build(reportes) response.write(buff.getvalue()) buff.close() return response
tarta.slices[3].fontColor = colors.red tarta.sideLabels = 1 leyenda = Legend() leyenda.x = 370 leyenda.y = 0 leyenda.dx = 8 leyenda.dy = 8 leyenda.fontName = 'Helvetica' leyenda.fontSize = 7 leyenda.boxAnchor = 'n' leyenda.columnMaximum = 10 leyenda.strokeWidth = 1 leyenda.strokeColor = colors.darkgray leyenda.deltax = 75 leyenda.deltay = 10 leyenda.autoXPadding = 5 leyenda.autoYPadding = 0 leyenda.yGap = 0 leyenda.dxTextSpace = 5 leyenda.alignment = 'right' leyenda.dividerLines = 1 | 2 | 4 leyenda.dividerOffsY = 4.5 leyenda.subCols.rpad = 30 colores = [colors.blue, colors.red, colors.green, colors.yellow, colors.pink] for i, color in enumerate(colores): tarta.slices[i].fillColor = color
def line_chart(data, labels, **kw): """ :param data: contains a three dimensional array of values (list of lists of points) or just a list of datapoint lists (it will be auto-transposed to start at 0) :type data: list :param labels: can contain, but must not ["xlabel", "ylabel", ["data label0", ...]] third item can also be an interger stating the iteration start as label when of same size as data, then a legend is added instead :type lables: ??? :param xlim: limit the x axis to these values, e.g. (0, 100) :type xlim: Tuple(Number, Number) :param ylim: limit the y axis to these values, e.g. (0, 50) :type ylim: Tuple(Number, Number) :param size: size in pixels, e.g. (18*cm, 9*cm) :type size: Tuple(Number, Number) :param title: title of bar chart :type title: string :param lines: list of colors we should use to paint lines :type lines: list[???] :param markers: list of markers we should use to draw markers :type markers: list[`PDF_LINE_MARKERS`,...] :param scatter: weather to do a scatter plot or line chart :type scatter: boolean """ # Get all arguments from the keywordargs title = kw.pop('title', None) scatter = kw.pop('scatter', False) size = kw.pop('plotSize', (18 * cm, 9 * cm)) lines = kw.pop('lines', PDF_CHART_COLORS) markers = kw.pop('markers', PDF_LINE_MARKERS) xlim = kw.pop('xlim', None) ylim = kw.pop('ylim', None) drawing = Drawing(size[0], size[1]) chart = None if(scatter): chart = ScatterPlot() else: chart = LinePlot() for key, val in list(kw.items()): setattr(chart, key, val) if title is not None: drawing.add(String(20, size[1] - 10, title), name='title') chart.y -= 10 chart.width = drawing.width - 20 chart.height = drawing.height - 40 chart.x = 10 chart.y = 10 chart.data = data if type(data[0][0]) in (tuple, list) else [list(zip(list(range(len(i))), i)) for i in data] max_y = 0 min_y = maxsize for i in range(len(data)): chart.lines[i].strokeColor = HexColor(lines[i % len(lines)]) if markers is not None: chart.lines[i].symbol = makeMarker(markers[i % len(markers)]) chart.lines[i].symbol.size = 3 max_y = max([k[1] for k in chart.data[i]] + [max_y]) min_y = min([k[1] for k in chart.data[i]] + [min_y]) chart.yValueAxis.valueMax = max_y * 1.1 chart.yValueAxis.valueMin = min_y * 0.9 chart.xValueAxis.visibleGrid = True chart.yValueAxis.visibleGrid = True if xlim is not None: chart.xValueAxis.valueMin = xlim[0] chart.xValueAxis.valueMax = xlim[1] if ylim is not None: chart.yValueAxis.valueMin = ylim[0] chart.yValueAxis.valueMax = ylim[1] if scatter: chart.xLabel = '' chart.yLabel = '' chart.y -= 10 chart.lineLabelFormat = None if labels is not None: if len(labels) > 0: xlabel = Label() xlabel._text = labels[0] # pylint: disable=W0212 xlabel.textAnchor = 'middle' xlabel.x = drawing.width / 2 xlabel.y = 5 chart.y += 15 drawing.add(xlabel, name="xlabel") if len(labels) > 1: ylabel = Label() ylabel._text = labels[1] # pylint: disable=W0212 xlabel.textAnchor = 'middle' ylabel.angle = 90 ylabel.x = 0 ylabel.y = drawing.height / 2 chart.x += 12 drawing.add(ylabel, name="ylabel") if len(labels) > 2: # when labels are of same size as max nr of data point, use as x axis labels if len(labels[2]) == max([len(x) for x in data]): chart.categoryAxis.categoryNames = labels[2] # pylint: disable=E1101 chart.xValueAxis.labels.angle = 30 # pylint: disable=E1101 # otherwise when integer use the counter elif type(labels[2]) == int: temp = range(labels[2], max([len(x) for x in data]) + labels[2]) chart.categoryAxis.categoryNames = temp # pylint: disable=E1101 # or we could add a legend when of same size as data elif len(labels[2]) == len(data): legend = Legend() chart.height -= 8 chart.y += 8 xlabel.y += 8 legend.boxAnchor = 'sw' legend.x = chart.x + 8 legend.y = -2 legend.columnMaximum = 1 legend.deltax = 50 legend.deltay = 0 legend.dx = 10 legend.dy = 1.5 legend.fontSize = 7 legend.alignment = 'right' legend.dxTextSpace = 5 legend.colorNamePairs = [(HexColor(lines[i]), labels[2][i]) for i in range(len(chart.data))] legend.strokeWidth = 0 drawing.add(legend, name='legend') drawing.add(chart, name='chart') return drawing