在Python中使用ReportLabs生成报告

在Python中使用ReportLabs生成报告,python,pdf,pdf-generation,reportlab,Python,Pdf,Pdf Generation,Reportlab,我有下面的代码,我在PDF中绘制了一个垂直条形图和一个直线图 如何将这两个图形保存在PDF的两个不同页面中。我看到可以使用以下方法来完成: c = canvas.Canvas("hello.pdf") hello(c) c.showPage() c.save() 但是,我使用的不是画布,而是不存在showPage()方法的绘图对象 如何在PDF的两个不同页面中保存这两个图形?右侧,第二个图形(折线图)与第一个图形(垂直条形图)重叠,从而妨碍了条形图 这是我的代码。 from reportlab

我有下面的代码,我在PDF中绘制了一个垂直条形图和一个直线图

如何将这两个图形保存在PDF的两个不同页面中。我看到可以使用以下方法来完成:

c = canvas.Canvas("hello.pdf")
hello(c)
c.showPage()
c.save()
但是,我使用的不是画布,而是不存在
showPage()
方法的绘图对象

如何在PDF的两个不同页面中保存这两个图形?右侧,第二个图形(折线图)与第一个图形(垂直条形图)重叠,从而妨碍了条形图

这是我的代码。

from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart

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.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)
drawing.save()

from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.widgets.markers import makeMarker

drawing = Drawing(400, 200)
data = [
((1,1), (2,2), (2.5,1), (3,3), (4,5)),
((1,2), (2,3), (2.5,2), (3.5,5), (4,6))
]
lp = LinePlot()
lp.x = 50
lp.y = 50
lp.height = 125
lp.width = 300
lp.data = data
lp.joinedLines = 1
lp.lines[0].symbol = makeMarker('FilledCircle')
lp.lines[1].symbol = makeMarker('Circle')
lp.lineLabelFormat = '%2.0f'
#lp.strokeColor = colors.black
lp.xValueAxis.valueMin = 0
lp.xValueAxis.valueMax = 5
lp.xValueAxis.valueSteps = [1, 2, 2.5, 3, 4, 5]
lp.xValueAxis.labelTextFormat = '%2.1f'
lp.yValueAxis.valueMin = 0
lp.yValueAxis.valueMax = 7
lp.yValueAxis.valueSteps = [1, 2, 3, 5, 6]
drawing.add(lp)
drawing.save()
drawing.save(formats=['pdf'],outDir='.',fnRoot=None) 
编辑

饼图

我指的是生成饼图。在这种情况下,颜色是为每个数据预定义的,即10种颜色代表10个数据点。如果我有11个数据点,那么第11个数据点就没有颜色了。我想要一些动态的东西,它应该自动选择一种颜色,并将其绘制在饼上

我找到了,但是这里的颜色不吸引人,一点也不好

你能告诉我如何在饼图中获得吸引人的颜色吗


谢谢

您可以使用
renderPDF
这样做:

from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.graphics.widgets.markers import makeMarker

def bar_chart():
    drawing = Drawing(400, 200)
    # ...
    drawing.add(bc)
    return drawing


def line_plot():
    drawing = Drawing(400, 200)
    # ...
    drawing.add(lp)
    return drawing


the_canvas = canvas.Canvas("output.pdf")
renderPDF.draw(bar_chart(), the_canvas, 0, 0)
the_canvas.showPage()
renderPDF.draw(line_plot(), the_canvas, 0, 0)
the_canvas.showPage()
the_canvas.save()
renderpf.draw()
的参数是(按顺序)您已经知道如何创建的
Drawing
对象、要粘贴绘图的画布以及绘图在页面上的水平和垂直位置(从左下角测量)


将PDF剪切到我留给您作为练习的大小。

您可以使用
renderPDF
这样做:

from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.graphics.widgets.markers import makeMarker

def bar_chart():
    drawing = Drawing(400, 200)
    # ...
    drawing.add(bc)
    return drawing


def line_plot():
    drawing = Drawing(400, 200)
    # ...
    drawing.add(lp)
    return drawing


the_canvas = canvas.Canvas("output.pdf")
renderPDF.draw(bar_chart(), the_canvas, 0, 0)
the_canvas.showPage()
renderPDF.draw(line_plot(), the_canvas, 0, 0)
the_canvas.showPage()
the_canvas.save()
renderpf.draw()
的参数是(按顺序)您已经知道如何创建的
Drawing
对象、要粘贴绘图的画布以及绘图在页面上的水平和垂直位置(从左下角测量)


将PDF裁剪到合适的大小我留给您作为练习。

将PDF裁剪到合适的大小意味着什么?从现在开始,我在左下角得到了图形。@user1162512:它的确切意思是:您必须更改画布的默认大小,使页面大小与绘图大小匹配。
u canvas.translate(1*inch,6*inch)
。但是,既然我的原点从(1*inch,6*inch)开始,我该如何在图表下方或原点下方打印文本呢?现在,限制我将赏金授予你,说我可以在48分钟后完成。我肯定会这么做的。Thanks@hop-请看我编辑的问题。我现在正试着画一个饼图。请看一看。谢谢将PDF压缩到大小意味着什么?从现在开始,我在左下角得到了图形。@user1162512:它的确切意思是:您必须更改画布的默认大小,使页面大小与绘图大小匹配。
u canvas.translate(1*inch,6*inch)
。但是,既然我的原点从(1*inch,6*inch)开始,我该如何在图表下方或原点下方打印文本呢?现在,限制我将赏金授予你,说我可以在48分钟后完成。我肯定会这么做的。Thanks@hop-请看我编辑的问题。我现在正试着画一个饼图。请看一看。谢谢