def simple_bar_chart_angled_labels(): d = Drawing(280, 250) bar = VerticalBarChart() bar.x = 50 bar.y = 85 data = [ [1, 2, 3, None, None, None, 5], [10, 5, 2, 6, 8, 3, 5], [5, 7, 2, 8, 8, 2, 5], [2, 10, 2, 1, 8, 9, 5], ] bar.data = data bar.categoryAxis.categoryNames = [ 'Year1', 'Year2', 'Year3', 'Year4', 'Year5', 'Year6', 'Year7' ] bar.bars[0].fillColor = colors.green bar.bars[1].fillColor = colors.blue bar.bars[2].fillColor = colors.red bar.bars[3].fillColor = colors.purple bar.categoryAxis.labels.angle = 45 bar.categoryAxis.labels.dy = -15 bar.groupSpacing = 12 bar.barSpacing = 2 d.add(bar, '') doc = SimpleDocTemplate('simple_bar_chart_angled_labels.pdf') story = [] story.append(d) doc.build(story)
def ventas_totales(pos, periodos, ventas_totales): arreglo = [periodos, ventas_totales] table = Table(arreglo, colWidths=3 * cm) table.setStyle([('ALIGN', (0, 0), (-1, -1), 'LEFT')]) for index, row in enumerate(arreglo): bg_color = colors.red ini, fin = (0, index), (len(row) - 1, index) table.setStyle([("BOX", ini, fin, 0.25, colors.black), ('INNERGRID', ini, fin, 0.25, colors.black), ('BACKGROUND', ini, fin, bg_color)]) story.append(table) d = Drawing(400, 200) data = [(11541548, 15618561, 56416646)] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 60000000 bc.valueAxis.valueStep = 10000000 #paso de distancia entre punto y punto bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 0 bc.categoryAxis.categoryNames = ['2017', '2018', '2019'] bc.groupSpacing = 10 bc.barSpacing = 2 #bc.categoryAxis.style = 'stacked' # Una variación del gráfico d.add(bc) #pprint.pprint(bc.getProperties()) story.append(d)
def myBarChart(data): drawing = Drawing(400, 200) bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.barWidth = .3 * inch bc.groupSpacing = .2 * inch bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 100 bc.valueAxis.valueStep = 10 bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 catNames = ('Trial1 Trial2 Trial3 Trial4 Trial5').split() bc.categoryAxis.categoryNames = catNames bc.bars[0].fillColor = colors.red bc.bars[1].fillColor = colors.lightblue drawing.add(bc) return drawing
def getVerticalBarChart(): data = [(3, 18, 20), (14, 12, 21)] chart = VerticalBarChart() chart.data = data chart.valueAxis.valueMin = 0 chart.valueAxis.valueMax = 25 chart.valueAxis.valueStep = 5 chart.x = 5 chart.y = 5 chart.width = 240 chart.height = 100 chart.strokeColor = colors.black chart.fillColor = colors.yellow chart.groupSpacing = 0 chart.categoryAxis.categoryNames = ['A', 'B', 'C'] title = String(50, 110, 'Vertical Bar Chart', fontSize=14) drawing = Drawing(240, 120) drawing.add(title) drawing.add(chart) return drawing
def xerar_barChart_serv(self): """ Xera un gráfico de barras co número de empregados por departamento nos últimos 8 meses a partir da base de datos :return: """ from reportlab.graphics.charts.barcharts import VerticalBarChart styles = getSampleStyleSheet() ptext = Paragraph( 'Número de empregados por departamento nos últimos 8 meses:', styles['Heading1']) self.story.append(ptext) d = Drawing(400, 200) p = self.cursor.execute( """SELECT (SELECT SUM(nempregados) FROM servizos WHERE (departamento = 'produccion')) AS prod, (SELECT SUM(nempregados) FROM servizos WHERE (departamento = 'finanzas')) AS finanzas, (SELECT SUM(nempregados) FROM servizos WHERE (departamento = 'informatica')) AS informatica, (SELECT SUM(nempregados) FROM servizos WHERE (departamento = 'publicidade')) FROM servizos AS publicidade """).fetchone() self.conn.text_factory = str data = [(25, 34, 14, 18, 36, 22, 19, p[0]), (26, 31, 22, 24, 16, 10, 18, p[1]), (34, 40, 18, 9, 25, 7, 2, p[2]), (29, 20, 19, 16, 34, 40, 15, p[3])] bc = VerticalBarChart() bc.x = 50 bc.y = 55 bc.height = 125 bc.width = 300 bc.data = data bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 50 bc.valueAxis.valueStep = 10 # paso de distancia entre punto y punto bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 30 bc.categoryAxis.categoryNames = [ 'Xan-19', 'Feb-19', 'Mar-19', 'Abr-19', 'Mai-19', 'Xuñ-19', 'Xul-19', 'Ago-19' ] bc.groupSpacing = 10 bc.barSpacing = 2 # bc.categoryAxis.style = 'stacked' # Una variación del gráfico d.add(bc) self.story.append(d)
def grafica(request): print "Genero el PDF[grafica]" response = HttpResponse(content_type='application/pdf') pdf_name = "Grafica.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, ) courses = [] styles = getSampleStyleSheet() header = Paragraph("Total de Cursos", styles['Heading2']) courses.append(header) styles = getSampleStyleSheet() d = Drawing(600, 300) conteo = Course.objects.count() # for i in Course.objects.all(): # print conteo data = [(conteo, )] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 200 bc.width = 300 bc.data = data bc.strokeColor = colors.blue bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 10 bc.valueAxis.valueStep = 1 #paso de distancia entre punto y punto bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 30 bc.categoryAxis.categoryNames = ['Cursos'] bc.groupSpacing = 10 bc.barSpacing = 2 d.add(bc) pprint.pprint(bc.getProperties()) courses.append(d) doc.build(courses) response.write(buff.getvalue()) buff.close() return response
def test_21_barCharts(self): from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib import colors from reportlab.platypus import SimpleDocTemplate, Spacer, Paragraph from reportlab.pdfbase import pdfmetrics from reportlab.graphics.shapes import Drawing from reportlab.pdfbase.ttfonts import TTFont from reportlab.graphics.charts.barcharts import VerticalBarChart pdfmetrics.registerFont(TTFont('chsFont', 'STHeiti Light.ttc')) stylesheet = getSampleStyleSheet() elements = [] doc = SimpleDocTemplate("demo.pdf") elements.append( Paragraph('<font name="chsFont">JY.zenist.song - 俊毅</font>', stylesheet['Title'])) elements.append(Spacer(1, 12)) d = Drawing(400, 200) data = [(13, 5, 20, 22, 37, 45, 19, 4), (14, 6, 21, 23, 38, 46, 20, 5)] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.strokeColor = colors.black bc.groupSpacing = 10 bc.barSpacing = 2.5 bc.valueAxis._valueMin = 0 bc.valueAxis._valueMax = 50 bc.valueAxis._valueStep = 10 bc.categoryAxis.categoryNames = [ '1', '2', '3', '4', '5', '6', '7', '8' ] # bc.categoryAxis.style = 'stacked' d.add(bc) elements.append(d) doc.build(elements)
def test_21_barCharts(self): from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib import colors from reportlab.platypus import SimpleDocTemplate, Spacer, Paragraph from reportlab.pdfbase import pdfmetrics from reportlab.graphics.shapes import Drawing from reportlab.pdfbase.ttfonts import TTFont from reportlab.graphics.charts.barcharts import VerticalBarChart pdfmetrics.registerFont(TTFont('chsFont', 'STHeiti Light.ttc')) stylesheet = getSampleStyleSheet() elements = [] doc = SimpleDocTemplate("demo.pdf") elements.append(Paragraph('<font name="chsFont">JY.zenist.song - 俊毅</font>', stylesheet['Title'])) elements.append(Spacer(1,12)) d = Drawing(400,200) data = [ (13,5,20,22,37,45,19,4), (14,6,21,23,38,46,20,5) ] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.strokeColor = colors.black bc.groupSpacing = 10 bc.barSpacing = 2.5 bc.valueAxis._valueMin = 0 bc.valueAxis._valueMax = 50 bc.valueAxis._valueStep = 10 bc.categoryAxis.categoryNames = ['1','2','3','4','5','6','7','8'] # bc.categoryAxis.style = 'stacked' d.add(bc) elements.append(d) doc.build(elements)
def draw(self, cur_drawing, start_x, start_y, end_x, end_y): """Draw a bar chart with the info in the specified range.""" bar_chart = VerticalBarChart() if self.chart_title: self._draw_title(cur_drawing, self.chart_title, start_x, start_y, end_x, end_y) # set the position of the bar chart x_start, x_end, y_start, y_end = self._determine_position(start_x, start_y, end_x, end_y) bar_chart.x = x_start bar_chart.y = y_start bar_chart.width = abs(x_start - x_end) bar_chart.height = abs(y_start - y_end) # set the information in the bar chart bar_chart.data = self.display_info bar_chart.valueAxis.valueMin = min(self.display_info[0]) bar_chart.valueAxis.valueMax = max(self.display_info[0]) for data_set in self.display_info[1:]: if min(data_set) < bar_chart.valueAxis.valueMin: bar_chart.valueAxis.valueMin = min(data_set) if max(data_set) > bar_chart.valueAxis.valueMax: bar_chart.valueAxis.valueMax = max(data_set) # set other formatting options if len(self.display_info) == 1: bar_chart.groupSpacing = 0 style = TypedPropertyCollection(BarChartProperties) style.strokeWidth = 0 style.strokeColor = colors.green style[0].fillColor = colors.green bar_chart.bars = style # set the labels # XXX labels don't work yet # bar_chart.valueAxis.title = self.x_axis_title # bar_chart.categoryAxis.title = self.y_axis_title cur_drawing.add(bar_chart)
def draw(self, cur_drawing, start_x, start_y, end_x, end_y): """Draw a bar chart with the info in the specified range.""" bar_chart = VerticalBarChart() if self.chart_title: self._draw_title(cur_drawing, self.chart_title, start_x, start_y, end_x, end_y) # set the position of the bar chart x_start, x_end, y_start, y_end = self._determine_position(start_x, start_y, end_x, end_y) bar_chart.x = x_start bar_chart.y = y_start bar_chart.width = abs(x_start - x_end) bar_chart.height = abs(y_start - y_end) # set the information in the bar chart bar_chart.data = self.display_info bar_chart.valueAxis.valueMin = min(self.display_info[0]) bar_chart.valueAxis.valueMax = max(self.display_info[0]) for data_set in self.display_info[1:]: if min(data_set) < bar_chart.valueAxis.valueMin: bar_chart.valueAxis.valueMin = min(data_set) if max(data_set) > bar_chart.valueAxis.valueMax: bar_chart.valueAxis.valueMax = max(data_set) # set other formatting options if len(self.display_info) == 1: bar_chart.groupSpacing = 0 style = TypedPropertyCollection(BarChartProperties) style.strokeWidth = 0 style.strokeColor = colors.green style[0].fillColor = colors.green bar_chart.bars = style # set the labels # XXX labels don't work yet # bar_chart.valueAxis.title = self.x_axis_title # bar_chart.categoryAxis.title = self.y_axis_title cur_drawing.add(bar_chart)
def getPDF(values=[]): d = Drawing(1700, 900) # image size chart = VerticalBarChart() chart.width = 1600 chart.height = 800 chart.x = 110 chart.y = 90 chart.data = [values] chart.groupSpacing = 10 chart.categoryAxis.labels.angle = 45 chart.valueAxis.labels.fontSize = 18 chart.valueAxis.valueMin = 0 chart.valueAxis.valueMax = getMaxValue(values) chart.categoryAxis.labels.fontSize = 24 chart.categoryAxis.categoryNames = n_store[1 : len(n_store)] chart.valueAxis.valueMin = 0 d.add(chart) d.save(fnRoot="test", formats=["pdf"])
def getVetricalBarChart(taxes_int): values = [] years = [] font = 'Arial' for year in taxes_int: years.append(year) values.append(taxes_int[year]) data = [values] chart = VerticalBarChart() chart.height = 180 chart.width = 450 chart.data = data chart.valueAxis.valueMin = 0 chart.barWidth = 20 chart.groupSpacing = 5 chart.barLabels.fontName = font chart.barLabels.fontSize = 8 chart.bars[0].fillColor = colors.cornflowerblue chart.barLabelFormat = '%d тг' chart.barLabels.nudge = 7 chart.categoryAxis.labels.fontName = font chart.categoryAxis.labels.fontSize = 8 chart.categoryAxis.categoryNames = years chart.valueAxis.labels.fontName = font chart.valueAxis.labels.fontSize = 8 # chart.valueAxis.gridStrokeDashArray = strokeDashArray # chart.valueAxis.gridStrokeWidth = strokeWidth # chart.valueAxis.strokeDashArray = strokeDashArray # chart.valueAxis.strokeWidth = strokeWidth drawing = Drawing(300) drawing.add(chart) return drawing
def myBarChart(data): drawing = Drawing(400, 200) bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.barWidth = .3*inch bc.groupSpacing = .2 * inch bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 100 bc.valueAxis.valueStep = 10 bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 catNames = string.split('Trial1 Trial2 Trial3 Trial4 Trial5') bc.categoryAxis.categoryNames = catNames bc.bars[0].fillColor = colors.blue bc.bars[1].fillColor = colors.lightblue drawing.add(bc) return drawing
def alpdf(mensaje): locale.getlocale() aux = mensaje.split('#') periodos = aux[0][2:-4].split(",") descriptores = aux [1][4:-2].split(",") #valor = int(descriptores[0]) #print("valor:",valor) #año = int(años_final[0][1:-1]) #print("descriptores: ",descriptores) #print("periodos ",periodos) doc = SimpleDocTemplate("SURALUM.pdf", pagesize=letter) story = [] imagen = Image(logotipo, 7 * cm, 3 * cm) story.append(imagen) story.append(Spacer(10, 20)) styles = getSampleStyleSheet() styles.add(ParagraphStyle(name='Center', alignment=TA_CENTER)) if (int(descriptores[0])):#VENTAS TOTALES print("ventas_totales") story.append(Paragraph('Ventas Totales por Año', styles['title'])) totales = [] connection_ddbb = cx_Oracle.connect(usr, passw, "localhost") cursor = connection_ddbb.cursor() for i in periodos: print() cursor = connection_ddbb.cursor() cursor.execute("SELECT id_venta, total, fecha FROM ventas WHERE EXTRACT(YEAR FROM fecha) = " + i) total = 0 for fname in cursor: total = total+ fname[1] #print ("Values:", fname[1]) totales.append(total) arreglo = [periodos,totales] table = Table(arreglo, colWidths=4* cm) table.setStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER')]) for index, row in enumerate(arreglo): ini, fin = (0, index), (len(row)-1, index) table.setStyle([ ("BOX", ini, fin, 0.25, colors.black), ('INNERGRID', ini, fin, 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.gray) ]) story.append(table) d = Drawing(300, 200) data = [totales] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 400 bc.data = data bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 1000000000 bc.valueAxis.valueStep = 100000000 #paso de distancia entre punto y punto bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 0 bc.categoryAxis.categoryNames = periodos bc.groupSpacing = 10 bc.barSpacing = 4 bc.barLabelFormat = '$%d' bc.valueAxis.labelTextFormat = ' $%d ' bc.barLabels.nudge = 7 d.add(bc) #pprint.pprint(bc.getProperties()) story.append(d) #print(story) ############################################################################################################################################################# if (int(descriptores[2][1:])): print("ventas por familia") story.append(Paragraph('Ventas por Familia', styles['title'])) connection_ddbb = cx_Oracle.connect(usr, passw, "localhost") cursor = connection_ddbb.cursor() totales = [('Periodo','Suralum','Huracan','Industrial')] valores_g = [] for i in periodos: cursor.execute("""SELECT productos.id_familia, SUM(venta_productos.cantidad * venta_productos.precio) as c FROM venta_productos INNER JOIN productos ON venta_productos.id_producto = productos.id_producto JOIN ventas ON venta_productos.id_venta=ventas.id_venta WHERE EXTRACT(YEAR FROM ventas.fecha) = """+i+"""AND(productos.id_familia=1 OR productos.id_familia=2 OR productos.id_familia=3) GROUP BY productos.id_familia ORDER BY productos.id_familia DESC """) vt=[(i)] vg =[] for valor in cursor: #print ("Values:", valor) vt.append(valor[1]) vg.append(valor[1]) #print(vt) totales.append(vt) valores_g.append(vg) table = Table(totales, colWidths=4*cm) table.setStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER')]) for index, row in enumerate(totales): ini, fin = (0, index), (len(row)-1, index) table.setStyle([ ("BOX", ini, fin, 0.25, colors.black), ('INNERGRID', ini, fin, 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.gray), ('BACKGROUND', (0, 0), (0,-1), colors.gray) ]) story.append(table) d = Drawing(600, 200) data = valores_g bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 400 bc.data = data bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 500000000 bc.valueAxis.valueStep = 100000000 #paso de distancia entre punto y punto bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 0 bc.categoryAxis.categoryNames = ('Suralum','Huracan','Industrial') bc.valueAxis.labelTextFormat = ' $%d ' bc.groupSpacing = 10 bc.barSpacing = 4 bc.barLabelFormat = '$%d' bc.barLabels.nudge = 7 legend=Legend() legend.x = 20 legend.y = 0 legend.boxAnchor = 'se' legend.subCols[1].align = 'right' legend.alignment = 'right' legend.columnMaximum = 9 legend.fontSize = 13 # these data can be read from external sources legend.colorNamePairs=Auto(obj=bc) d.add(bc) d.add(legend) #pprint.pprint(bc.getProperties()) story.append(d) #print(totales) if (int(descriptores[3][1:])): print("Suralum") story.append(Paragraph('Ventas Suralum', styles['title'])) connection_ddbb = cx_Oracle.connect(usr, passw, "localhost") cursor = connection_ddbb.cursor() for i in periodos: #print("para el periodo:",i) cursor.execute("""SELECT productos.descripcion, SUM(venta_productos.cantidad) as v, SUM(venta_productos.cantidad * venta_productos.precio) as c FROM venta_productos JOIN productos ON venta_productos.id_producto = productos.id_producto JOIN ventas ON venta_productos.id_venta=ventas.id_venta WHERE EXTRACT(YEAR FROM ventas.fecha) = """+i+"""AND productos.id_familia=1 GROUP BY productos.descripcion ORDER BY v DESC""") #AGREGAR TITULO DEL PERIODO AL STORY PARA SEPARAR LAS TABLAS story.append(Paragraph('Año:'+i, styles['Center'])) k= 0 totales = [] totales.append(head) for valor in cursor: producto = [] if (k < 12): producto.append(valor[0])#nombre producto.append(valor[1])#totales_ccantidad producto.append(valor[2])#totales_ventas totales.append(producto) k = k+1 table = Table(totales, colWidths=4*cm) table.setStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER')]) for index, row in enumerate(totales): bg_color = colors.green ini, fin = (0, index), (len(row)-1, index) table.setStyle([ ("BOX", ini, fin, 0.25, colors.black), ('INNERGRID', ini, fin, 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.gray) ]) story.append(Spacer(10, 20)) story.append(table) story.append(Spacer(10, 20)) ############################################################################################################################ if (int(descriptores[4][1:])): print("Huracan") story.append(Paragraph('Ventas Huracan', styles['title'])) connection_ddbb = cx_Oracle.connect(usr, passw, "localhost") cursor = connection_ddbb.cursor() for i in periodos: #print("para el periodo:",i) cursor.execute("""SELECT productos.descripcion, SUM(venta_productos.cantidad) as v, SUM(venta_productos.cantidad * venta_productos.precio) as c FROM venta_productos JOIN productos ON venta_productos.id_producto = productos.id_producto JOIN ventas ON venta_productos.id_venta=ventas.id_venta WHERE EXTRACT(YEAR FROM ventas.fecha) = """+i+"""AND productos.id_familia=2 GROUP BY productos.descripcion ORDER BY v DESC""") #AGREGAR TITULO DEL PERIODO AL STORY PARA SEPARAR LAS TABLAS story.append(Paragraph('Año:'+i, styles['Center'])) k= 0 totales = [] totales.append(head) for valor in cursor: producto = [] if (k < 12): producto.append(valor[0])#nombre producto.append(valor[1])#totales_ccantidad producto.append(valor[2])#totales_ventas totales.append(producto) k = k+1 table = Table(totales, colWidths=4*cm) table.setStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER')]) for index, row in enumerate(totales): bg_color = colors.violet ini, fin = (0, index), (len(row)-1, index) table.setStyle([ ("BOX", ini, fin, 0.25, colors.black), ('INNERGRID', ini, fin, 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.gray) ]) story.append(Spacer(10, 20)) story.append(table) story.append(Spacer(10, 20)) ####################################################################################################################################### if (int(descriptores[5][1:])): print("Industrial") story.append(Paragraph('Ventas Industrial', styles['title'])) connection_ddbb = cx_Oracle.connect(usr, passw, "localhost") cursor = connection_ddbb.cursor() for i in periodos: #print("para el periodo:",i) cursor.execute("""SELECT productos.descripcion, SUM(venta_productos.cantidad) as v, SUM(venta_productos.cantidad * venta_productos.precio) as c FROM venta_productos JOIN productos ON venta_productos.id_producto = productos.id_producto JOIN ventas ON venta_productos.id_venta=ventas.id_venta WHERE EXTRACT(YEAR FROM ventas.fecha) = """+i+"""AND productos.id_familia=3 GROUP BY productos.descripcion ORDER BY v DESC""") #AGREGAR TITULO DEL PERIODO AL STORY PARA SEPARAR LAS TABLAS story.append(Paragraph('Año:'+i, styles['Center'])) k= 0 totales = [] totales.append(head) for valor in cursor: producto = [] if (k < 12): producto.append(valor[0])#nombre producto.append(valor[1])#totales_ccantidad producto.append(valor[2])#totales_ventas totales.append(producto) k = k+1 table = Table(totales, colWidths=4*cm) table.setStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER')]) for index, row in enumerate(totales): bg_color = colors.aqua ini, fin = (0, index), (len(row)-1, index) table.setStyle([ ("BOX", ini, fin, 0.25, colors.black), ('INNERGRID', ini, fin, 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.gray) ]) story.append(Spacer(10, 20)) story.append(table) story.append(Spacer(10, 20)) if (int(descriptores[6][1:])): print("mas vendido") story.append(Paragraph('PRODUCTOS MÁS VENDIDOS', styles['title'])) connection_ddbb = cx_Oracle.connect(usr, passw, "localhost") cursor = connection_ddbb.cursor() for i in periodos: cursor.execute("""SELECT productos.descripcion, SUM(venta_productos.cantidad) as v, SUM(venta_productos.cantidad * venta_productos.precio) as c FROM venta_productos JOIN productos ON venta_productos.id_producto = productos.id_producto JOIN ventas ON venta_productos.id_venta=ventas.id_venta WHERE EXTRACT(YEAR FROM ventas.fecha) = """+i+""" GROUP BY productos.descripcion ORDER BY v DESC""" ) story.append(Paragraph('Año:'+i, styles['Center'])) k= 0 totales = [] totales.append(head) for valor in cursor: producto = [] if (k < 20): producto.append(valor[0])#nombre producto.append(valor[1])#totales_ccantidad producto.append(valor[2])#totales_ventas #producto.append(valor[3])#familia totales.append(producto) k = k+1 table = Table(totales, colWidths=4*cm) table.setStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER')]) for index, row in enumerate(totales): bg_color = colors.aqua ini, fin = (0, index), (len(row)-1, index) table.setStyle([ ("BOX", ini, fin, 0.25, colors.black), ('INNERGRID', ini, fin, 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.gray) ]) story.append(Spacer(10, 20)) story.append(table) story.append(Spacer(10, 20)) doc.build(story)
drawing = Drawing(400, 200) data = [ (13, 5, 20, 22, 37, 45, 19, 4), (14, 6, 21, 23, 38, 46, 20, 5) ] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.strokeColor = colors.black bc.groupSpacing = 10 bc.barSpacing = 2.5 bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 50 bc.valueAxis.valueStep = 10 bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 30 bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99', 'Apr-99','May-99','Jun-99','Jul-99','Aug-99'] drawing.add(bc)
def pdf_drawBar(self, chart_data, categoryNames=[], bar_color=[], title="", title_size=70, title_font=FONTBLOD, x=300, y=1600, chart_width=2000, chart_height=655, lable_fontSize=50, background_color=HexColor(0x000000), lable_angle=0, lable_y=0): ''' @example: chart_data = [25,65,330] chart_lable=['Rank','Total Entries'] data = [] data.append(chart_data) self.pdf_drawBar(data,categoryNames = chart_lable) ''' y = self.pdf_config_object.pdf_height - y title_position = self.get_title_position(chart_width, title, title_size) self.pdf_page_object.setFillColor(HexColor(0x000000)) self.pdf_page_object.setFont(title_font, title_size) self.pdf_page_object.drawString(x + title_position - 150, y + chart_height + title_size * 3 - 80, title) max_list = [] for index in range(len(chart_data)): if chart_data[index]: max_list.append(max(chart_data[index])) else: max_list.append(0) barchart_max = max(max_list) + 100 drawing = Drawing(800, 2230) bc = VerticalBarChart() bc.x = 0 bc.y = 0 bc.height = chart_height bc.width = chart_width bc.data = chart_data bc.groupSpacing = 15 bc.barSpacing = 10 bc.strokeColor = HexColor(0xDFDFDF) bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = barchart_max + barchart_max / 20 bc.valueAxis.valueStep = (barchart_max + barchart_max / 20) / 5 bc.valueAxis.visible = 0 bc.valueAxis.gridStrokeColor = colors.gray bc.valueAxis.visibleGrid = 1 bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = lable_y bc.categoryAxis.labels.fontSize = lable_fontSize bc.categoryAxis.labels.angle = lable_angle bc.categoryAxis.categoryNames = categoryNames if len(bar_color) == 0: for i in range(len(chart_data)): bar_color.append(HexColor(self.randomcolor())) for i in range(len(chart_data)): setattr(bc.bars[i], 'fillColor', bar_color[i]) setattr(bc.bars[i], 'strokeColor', colors.white) bc.fillColor = HexColor(0xffffff) drawing.add(bc) drawing.drawOn(self.pdf_page_object, x, y) barchart_max = barchart_max + barchart_max / 20 try: colWidths = chart_width / (len(chart_data[0])) except ZeroDivisionError as e: raise e return yheight = chart_height yStart = y self.pdf_page_object.setFillColor(background_color) self.pdf_page_object.setFont(FONTBLOD, 50) for i in range(len(chart_data)): width = 0 if not chart_data[i] == 0: for j in range(len(chart_data[i])): width = x + j * colWidths try: if len(chart_data) == 1: self.pdf_page_object.drawCentredString( width + colWidths / 2, yStart + yheight * chart_data[i][j] / barchart_max + 20, format(int(chart_data[i][j]), ',')) else: self.pdf_page_object.drawCentredString( width + colWidths / (2 * len(chart_data) + 1) * ((i + 1) * 2) - colWidths / (2 * len(chart_data) + 1) / 2, yStart + yheight * chart_data[i][j] / barchart_max + 20, format(int(chart_data[i][j]), ',')) except Exception as e: raise e
gBarra.width = 300 gBarra.data = datos gBarra.valueAxis.valueMin = 0 gBarra.valueAxis.valueMax = 50 gBarra.valueAxis.valueStep = 10 # podemos ponerle un estilo, sino pondrá el predeterrminado gBarra.categoryAxis.style = 'stacked' gBarra.categoryAxis.labels.boxAnchor = 'ne' # noroeste gBarra.categoryAxis.labels.dx = 8 gBarra.categoryAxis.labels.dy = -2 gBarra.categoryAxis.labels.angle = 30 gBarra.categoryAxis.categoryNames = [ 'Xan-17', 'Feb-17', 'Mar-17', 'Abr-17', 'Mai-17', 'Xun-17', 'Xul-17', 'Ago-17' ] gBarra.groupSpacing = 10 gBarra.barSpacing = 2 d.add(gBarra) # añadimos un nuevo dibujo d2 = Drawing(300, 200) tarta = Pie() tarta.x = 65 tarta.y = 15 tarta.height = 170 tarta.width = 170 tarta.data = [10.456, 20.234, 30.567, 40, 50] tarta.labels = ['Azucre', 'Borrajas', 'Carne', 'Datiles', 'Espinacas'] # porciones tarta.slices.strokeWidth = 0.5
('TEXTCOLOR', (0, 0), (0, 3), colors.blue)]) tabla.setStyle([('BACKGROUND', (1, 1), (-1, -1), colors.aliceblue)]) tabla.setStyle([('INNERGRID', (1, 1), (-1, -1), 0.25, colors.darkgray)]) doc = [tabla] d = Drawing(400, 400) gb = VerticalBarChart() gb.x = 50 gb.y = 50 gb.height = 125 gb.width = 300 gb.data = listaDatosEdade gb.strokeColor = colors.black gb.valueAxis.valueMin = 0 gb.valueAxis.valueMax = 100 gb.valueAxis.valueStep = 10 gb.categoryAxis.labels.boxAnchor = 'ne' gb.categoryAxis.labels.dx = 8 gb.categoryAxis.labels.dy = -2 gb.categoryAxis.labels.angle = 30 gb.categoryAxis.categoryNames = listaDatosNome gb.groupSpacing = 10 gb.barSpacing = 2 d.add(gb) doc.append(d) documento = SimpleDocTemplate("informeTabla.pdf", pagesize=A4, showBoundary=0) documento.build(doc)
def reporte4_pdf(request, pk_proyecto): from reportlab.graphics.shapes import Drawing, Rect, String, Group, Line from reportlab.graphics.charts.barcharts import VerticalBarChart proy = Proyecto.objects.get(id=pk_proyecto) story = [] estilo = getSampleStyleSheet() import pprint estiloHoja = getSampleStyleSheet() cabecera = estiloHoja['Heading2'] cabecera.pageBreakBefore = 0 cabecera.keepWithNext = 0 cabecera.backColor = colors.white cabecera.spaceAfter = 0 cabecera.spaceBefore = 0 parrafo = Paragraph('', cabecera) story.append(parrafo) parrafo = Paragraph('CUARTO INFORME DEL' + '"' + proy.nombre_largo + '" : ', cabecera) story.append(parrafo) parrafo = Paragraph('_' * 66, cabecera) story.append(parrafo) cabecera2 = estiloHoja['Heading2'] cabecera2.pageBreakBefore = 0 cabecera2.keepWithNext = 0 cabecera2.backColor = colors.white parrafo = Paragraph( 'GRAFICO DE TIEMPO ESTIMADO Y EJECUTADO POR SPRINT DEL PROYECTO' + '"' + proy.nombre_largo + '"', cabecera2) story.append(parrafo) d = Drawing(400, 200) sprints = Sprint.objects.filter(proyecto=proy) print sprints listasprint = [] listaplan = [] listaejec = [] for sp in sprints: listasprint.append(sp.nombre) US = UserStory.objects.filter(sprint=sp) print US tarea = Tarea.objects.filter(user_story_id= US) totalus = 0 sumatarea = 0 for u in US: totalus += u.estimacion for t in tarea: sumatarea += t.horas_de_trabajo listaejec.append(totalus) listaplan.append(sumatarea) mayor = 0 for j in listaejec: if j > mayor: mayor = j for j in listaplan: if j > mayor: mayor = j data = [listaplan, listaejec] bc = VerticalBarChart() bc.x = 50 bc.y = 50 bc.height = 125 bc.width = 300 bc.data = data bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = mayor + 10 bc.valueAxis.valueStep = 10 #paso de distancia entre punto y punto bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 30 bc.categoryAxis.categoryNames = listasprint bc.groupSpacing = 10 bc.barSpacing = 2 d.add(bc) pprint.pprint(bc.getProperties()) story.append(d) cabecera2 = estiloHoja['Heading2'] cabecera2.pageBreakBefore = 0 cabecera2.keepWithNext = 0 cabecera2.backColor = colors.white parrafo = Paragraph('ROJO = TIEMPO ESTIMADO', cabecera2) story.append(parrafo) cabecera2 = estiloHoja['Heading2'] cabecera2.pageBreakBefore = 0 cabecera2.keepWithNext = 0 cabecera2.backColor = colors.white parrafo = Paragraph('VERDE = TIEMPO EJECUTADO', cabecera2) story.append(parrafo) story.append(Spacer(0, 20)) parrafo = Paragraph('_' * 66, cabecera) story.append(parrafo) #parrafo = Paragraph('FIN DE CUARTO INFORME' + ' ' * 100 + '(' + str(datetime.date.today()) + ')', cabecera) parrafo = Paragraph('FIN DE CUARTO INFORME', cabecera) story.append(parrafo) buff = BytesIO() doc = SimpleDocTemplate(buff, pagesize=letter, rightMargin=40, leftMargin=40, topMargin=60, bottomMargin=18, ) doc.build(story) response = HttpResponse(content_type='application/pdf') pdf_name = "Reporte.pdf" response.write(buff.getvalue()) buff.close() return response
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 auto_chart(self, allcount, failcount, faillist, info, pathnow) : from reportlab.graphics.shapes import Drawing from reportlab.graphics import renderPDF from reportlab.graphics.charts.barcharts import VerticalBarChart from reportlab.lib import colors info = info.replace(',', ',') info = info.split(',') c = 0 infolist = ['project name:','version:','test type:','tester:','results:'] testtype = info[2] if failcount == 0 : info.append('pass') elif failcount != 0 : info.append('fail') drawing = Drawing(800,900) data = [(failcount,),((allcount - failcount),)] bc = VerticalBarChart() bc.x = 250 bc.y = 110 bc.height = 250 bc.width = 300 bc.groupSpacing = 25 bc.data = data bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 bc.valueAxis.valueMax = 16 bc.valueAxis.valueStep = 1 bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 4 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 30 bc.categoryAxis.categoryNames = ['%s' %info[1],] bc.categoryAxis.style = 'stacked' drawing.add(bc) drawing.add(String(350,860,"Test Report!",fontSize=25, fillColor=colors.black)) for i in infolist : xt = '%s%s' %(i,info[0]) try: x_wid = self.get_width(xt, 14, 1) except Exception as e: print(e) x = 100 + x_wid/2 y = 800 - c c += 25 drawing.add(self.cn_process(i+info[0], x, y, pathnow)) info.remove(info[0]) xt2 = 100+(self.get_width("this %s has run %2d test case(s). pass: %2d, fail: %2d." %(testtype,allcount,(allcount-failcount),failcount),14,1)/2) drawing.add(self.cn_process("this %s has run %2d test case(s). pass: %2d, fail: %2d." %(testtype,allcount,(allcount-failcount),failcount), xt2, 650, pathnow)) if failcount != 0 : xt3 = 100 +(self.get_width("failed details: ",14,1)/2) drawing.add(self.cn_process("failed details: ", xt3, 625, pathnow)) drawing.add(self.cn_process("Dept.QA", 640, 80, pathnow)) y2 = 625 for m in faillist : y2 -= 25 xt3 = 130 + (self.get_width(m,14,1)/2) if xt3 > 500 : m = m[:65] + '...' xt3 = 130 + (self.get_width(m,14,1)/2) drawing.add(self.cn_process(m, xt3, y2, pathnow)) renderPDF.drawToFile(drawing, 'D:/WebZ/test report.pdf')
def MakeHistogram(filename): #, data): ''' c = canvas.Canvas(filename, pagesize=A2) # A2 = C size = 17x22 inches width, height = A2 c.rect(36, 36, width-72, height-72, stroke=1, fill=0) # x, y, width, height, stroke, fill ''' ''' #framePage(c, 'Color Demo - RGB Space - page %d' % c.getPageNumber()) miny = 10000000 maxy = 0 for bin in bins: print bin if bin > maxy: maxy = bin if bin < min: miny = bin # minx = 0 maxx = len(data) ''' ''' x = 10 for bin in data: c.setFillColor(colors.red) c.rect(x, 100, 10, bin, stroke=1, fill=1) # x, y, width, height, stroke, fill x += 20 #all_colors = reportlab.lib.colors.getAllNamedColors().items() #all_colors.sort() # alpha order by name #c.setFont('Times-Roman', 12) #c.drawString(72,730, 'This shows all the named colors in the HTML standard.') #y = 700 #for (name, color) in all_colors: #c.setFillColor(colors.black) #c.drawString(100, y, name) #c.setFillColor(color) #c.rect(200, y-10, 300, 30, fill=1) #y = y - 40 #if y < 100: #c.showPage() #framePage(c, 'Color Demo - RGB Space - page %d' % c.getPageNumber()) #y = 700 # c.showPage() c.save() ''' #------------------------------ from reportlab.graphics.shapes import Drawing from reportlab.graphics.charts.barcharts import VerticalBarChart drawing = Drawing(1600, 1200) data = \ [ (99, 99, 97, 95, 87, 93), (56, 48, 59, 50, 56, 52), (50, 50, 50, 50, 50, 50) ] bc = VerticalBarChart() bc.x = 250 # Position bc.y = 250 bc.height = 700 # Size bc.width = 1000 #bc.data = [data] # Expects a list of tuples; one tuple for each series bc.data = data # Expects a list of tuples; one tuple for each series bc.strokeColor = colors.black bc.valueAxis.valueMin = 0 #top = (maxy + 100) / 100 #top = top * 100 #bc.valueAxis.valueMax = top #bc.valueAxis.valueStep = 100 bc.groupSpacing = 100 bc.barSpacing = 0 bc.barWidth = 50 bc.categoryAxis.labels.boxAnchor = 'ne' bc.categoryAxis.labels.dx = 8 bc.categoryAxis.labels.dy = -2 bc.categoryAxis.labels.angle = 0 bc.categoryAxis.labels._value.fontSize = 20 bc.categoryAxis.categoryNames = [ 'Composite', 'Vocabulary', 'Reading', 'Language', 'Mathematics', 'Sources' ] drawing.add(bc) from reportlab.graphics import renderPDF renderPDF.drawToFile(drawing, filename, 'Test') '''
def balance_statistics_chart(self, control_vars, match_vars, var_names): """ Specify layout of the balance statistics chart and generate flowable object that can be added to the pdf """ drawing = Drawing() vbc = VerticalBarChart() # Chart position in document vbc.x = self.chart_offset_x vbc.y = self.chart_offset_y vbc.height = self.chart_height vbc.width = self.chart_width # Specify data # [[control_var1, control_var2], [match_var1, match_var2]] vbc.data = [control_vars, match_vars] #Set Y-Axis ranges #axis_range = self._calculate_y_axis(vbc.data) #vbc.valueAxis.valueMin = axis_range['min'] #vbc.valueAxis.valueMax = axis_range['max'] #vbc.valueAxis.valueStep = axis_range['step'] #Grid formatting vbc.valueAxis.visibleGrid = 1 vbc.valueAxis.gridStrokeColor = colors.lightgrey #Bar formatting vbc.bars[0].fillColor = colors.blue vbc.bars[1].fillColor = colors.yellow vbc.bars.strokeColor = None vbc.groupSpacing = 1 vbc.barWidth = 5 # Callout label formatting (numbers above bar) #vbc.barLabels.fontName = "Arial" vbc.barLabels.fontSize = 8 vbc.barLabels.fillColor = colors.black vbc.barLabelFormat = '%.2f' vbc.barLabels.nudge = 5 # Central axis vbc.categoryAxis.visibleTicks = 1 # X-axis labels #vbc.categoryAxis.labels.dy = -60 vbc.valueAxis.labels.fontName = 'Helvetica' vbc.categoryAxis.categoryNames = var_names lab = Label() lab.setOrigin(10, 155) lab.boxAnchor = 'ne' lab.angle = 90 lab.dx = 0 lab.dy = -15 #lab.boxStrokeColor = colors.green lab.setText('Percent Bias') drawing.add(lab) drawing.add(vbc) self.elements.append(drawing)