【问题标题】:Generating Reports using ReportLabs in Python在 Python 中使用 ReportLabs 生成报告
【发布时间】:2013-12-11 02:42:22
【问题描述】:

我有以下代码,我在 PDF 中绘制垂直条形图和折线图。

如何将这 2 个图表保存在 PDF 的 2 个不同页面中。我看到它可以使用 -

c = canvas.Canvas("hello.pdf")
hello(c)
c.showPage()
c.save()

但是,我没有使用 Canvas,而是使用不存在 showPage() 方法的绘图对象。

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

这是我的代码。

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) 

编辑

饼图

我指的是this link 用于生成饼图。在此,颜色是为每个数据预定义的,即 10 个数据点的 10 种颜色。如果我有 11 个数据点,那么第 11 个数据点将没有颜色怎么办?我想要一些动态的东西,它应该自动选择一种颜色并将其绘制在饼图上。

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

能否请您简要介绍一下如何在饼图中获得醒目的颜色?

谢谢

【问题讨论】:

    标签: python pdf pdf-generation reportlab


    【解决方案1】:

    您可以像这样使用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()
    

    renderPDF.draw() 的参数(按顺序)是您已经知道如何创建的 Drawing 对象、您要在其上粘贴绘图的画布以及绘图在页面上的水平和垂直位置(如从左下角开始测量)。

    将 PDF 裁剪成我留给你的练习。

    【讨论】:

    • 将 PDF 裁剪成合适的大小意味着什么?截至目前,我在左下角得到图表。
    • @user1162512:这意味着:您必须更改默认的画布尺寸以使页面尺寸与您的绘图尺寸相匹配。
    • the_canvas.translate(1*inch,6*inch) 有效。但是,既然我的原点从 (1*inch,6*inch) 开始,我将如何在图形下方或原点下方打印文本?
    • 截至目前,SO 限制我将赏金奖励给你,说我可以在 48 分钟后完成。我一定会这样做的。谢谢
    • @hop- 请查看我编辑的问题。我现在正在尝试绘制饼图。请看一看。谢谢
    猜你喜欢
    • 2023-01-31
    • 2012-09-05
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多