ReportLab 导出 PDF(图文表格)

news2025/5/19 12:25:27

ReportLab 导出 PDF(文档创建)
ReportLab 导出 PDF(页面布局)
ReportLab 导出 PDF(图文表格)

文章目录

  • 1. Paragraph(段落)
  • 2. Table(表格)
  • 3. VerticalBarChart(柱形图表)
    • 3.1. 多组多条数据
    • 3.2. 多组单条数据
    • 3.3. 柱状图累加
  • 4. 饼状图
  • 5. Image(图像)
  • 6. 常用颜色
  • 7. 字体与编码

1. Paragraph(段落)

官网:
https://docs.reportlab.com/reportlab/userguide/ch6_paragraphs/

https://blog.csdn.net/weixin_49278803/article/details/132907427

canvas.drawString(80, 700, 'Standard String')				# 标准绘制函数
canvas.drawRightString(80, 680, 'Right String')				# x轴右对齐绘制函数
canvas.drawAlignedString(60, y, str(number))				# 轴对称绘制函数
canvas.drawCentredString(width/2, 550, 'Centered String')	# 中心对称绘制函数

https://blog.csdn.net/icloudend/article/details/98902717

2. Table(表格)

https://www.cnblogs.com/jilingxf/p/15857940.html

from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

from reportlab.graphics.charts.barcharts import VerticalBarChart    # 图表类
from reportlab.graphics.charts.legends import Legend                # 图例类
from reportlab.graphics.shapes import Drawing                       # 绘图工具
from reportlab.platypus import Table, Paragraph, TableStyle
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet

def draw_table1(datas: list):
    col_widths, row_heights = [80, 100, 100, 100, 100], [60, 50, 50, 50, 50, 50]
    # 表格行列的表达形式为(x, y):左上方第一个单元格为(0, 0), 右下角单元格为(-1, -1)
    table_style = TableStyle([
        ("FONT", (0, 0), (0, -1), "simsun", 15),                # 第一列:配置字体
        ("FONT", (0, 0), (-1, 0), "simsun", 15),                # 第一行:
        ("FONT", (1, 1), (-1, -1), "simsun", 12),
        ("ALIGN", (0, 0), (-1, -1), "CENTER"),                  # 水平居中
        ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),                 # 垂直居中
        ("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black),    # 单元格分割线
        ("BOX", (0, 0), (-1, -1), 0.25, colors.black),          # 边框
        ("BACKGROUND", (0, 0), (-1, -1), colors.lightgrey),     # 背景色(默认为白色)
        ("TEXTCOLOR", (0, 0), (-1, 0), colors.red),             # 第一行: 区域字体颜色
        ("LINEBELOW", (0,-1), (-1,-1), 0, colors.white),        # 移除最后一行的下框线,延申LINEABOVE(上框线)、LINEBEFORE(左框线)、LINEAFTER(右框线)
        # ("GRID", (0, 0), (-1, -1), 0.5, colors.black),        # 表格框线为灰色,线宽为0.5
        # ("SPAN", (0, 3), (-1, 3)),                              # 合并单元格
    ])

    return Table(datas, colWidths=col_widths, rowHeights=row_heights, style=table_style)

def draw_table2(datas: list):
    col_widths, row_heights = [80, 100, 100, 100, 100], [30, 25, 25, 25, 25, 25]
    # 表格行列的表达形式为(x, y):左上方第一个单元格为(0, 0), 右下角单元格为(-1, -1)
    table_style = TableStyle([
        ("FONT", (0, 0), (0, -1), "simsun", 20),                # 第一列:配置字体
        ("FONT", (0, 0), (-1, 0), "simsun", 15),                # 第一行:
        ("FONT", (1, 1), (-1, -1), "simsun", 15),
        ("ALIGN", (0, 0), (-1, -1), "CENTER"),                  # 水平居中
        ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),                 # 垂直居中
        ("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black),    # 单元格分割线
        ("BOX", (0, 0), (-1, -1), 0.25, colors.black),          # 边框
        # ("BACKGROUND", (0, 0), (-1, -1), colors.lightgrey),     # 背景色(默认为白色)
        ("TEXTCOLOR", (0, 0), (-1, 0), colors.red),             # 第一行: 区域字体颜色
        # ("LINEBELOW", (0,-1), (-1,-1), 0, colors.white),        # 移除最后一行的下框线,延申LINEABOVE(上框线)、LINEBEFORE(左框线)、LINEAFTER(右框线)
        # ("GRID", (0, 0), (-1, -1), 0.5, colors.black),        # 表格框线为灰色,线宽为0.5
        ("SPAN", (0, 3), (-1, 3)),                              # 合并单元格
    ])

    return Table(datas, colWidths=col_widths, rowHeights=row_heights, style=table_style)

def main(filename):
    # pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))
    pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))

    doc = SimpleDocTemplate(filename, pagesize=A4)
    Story = []
    datas = [
        ["姓名", "语文", "数学", "英语", "体育"],
        ["张三", 91, 97, 79, "良好"],
        ["李四", 99, 87, 73, "优秀"],
        ["王五", 86, 89, 83, "良好"],
        ["赵六", 95, 88, 86, "良好"],
        # 当需要将数据在一个单元格分两列的话,可以用下面的语法
        ["孙七", 79, 95, 98, "良"+"\n"+"好"],
    ]

    # 编辑表格标题及样式
    tabletitle = """<para alignment=center fontName="simsun" fontSize=20 spaceAfter=30>表1: 学生成绩表</para>"""
    # 可以配置上下左右页边距,topMargin=1*cm,bottomMargin=1*cm,leftMargin=1*cm,rightMargin=1*cm
    Story.append(Paragraph(tabletitle, getSampleStyleSheet()["Normal"]))
    Story.append(draw_table1(datas))

    tabletitle = """<para alignment=center fontName="simsun" fontSize=20 spaceBefore=30 spaceAfter=30>表1: 学生成绩表</para>"""
    Story.append(Paragraph(tabletitle))
    Story.append(draw_table2(datas))
    doc.build(Story)

if __name__ == '__main__': 
    main(filename='example.pdf')

在这里插入图片描述

3. VerticalBarChart(柱形图表)

参考:
https://blog.csdn.net/weixin_49278803/article/details/132907427
https://www.cnblogs.com/hujq1029/p/7767980.html
https://zhuanlan.zhihu.com/p/528669672

3.1. 多组多条数据

from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

from reportlab.graphics.charts.barcharts import VerticalBarChart    # 图表类
from reportlab.graphics.charts.legends import Legend                # 图例类
from reportlab.graphics.shapes import Drawing                       # 绘图工具

# 多组多列
def draw_group_bars1(datas: list, categorys: list, legends: list):
    drawing = Drawing(500, 250)
    bc = VerticalBarChart()
    bc.x                            = 45            # 整个图表的x坐标
    bc.y                            = 45            # 整个图表的y坐标
    bc.height                       = 200           # 图表的高度
    bc.width                        = 350           # 图表的宽度
    bc.data                         = datas
    bc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色
    bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值
    bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值
    bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长
    bc.groupSpacing                 = 10            # 每组柱状图之间的间隔
    # bc.barSpacing                   = 1           # 每个柱状图之间的间隔
    bc.categoryAxis.labels.dx       = 2             # x和y是x轴下方的标签距离x轴远近的坐标
    bc.categoryAxis.labels.dy       = -8
    # bc.categoryAxis.labels.angle    = 20            # x轴上描述文字的倾斜角度
    bc.categoryAxis.categoryNames   = categorys

    bc.bars[0].fillColor = colors.red
    bc.bars[1].fillColor = colors.orange
    bc.bars[2].fillColor = colors.yellow
    bc.bars[3].fillColor = colors.green

    # 图示
    leg = Legend()
    leg.fontName        = 'simsun'
    leg.alignment       = 'right'                   # 文字在色块的左或者右
    leg.boxAnchor       = 'ne'
    leg.x               = 475                       # 图例的x坐标
    leg.y               = 240
    leg.dxTextSpace     = 10                        # 色块与文字之间的间距
    leg.columnMaximum   = len(legends)
    leg.colorNamePairs  = legends
    drawing.add(leg)
    drawing.add(bc)
    return drawing

# 多组多列
def draw_group_bars2(datas: list, categorys: list, legends: list):
    drawing = Drawing(500, 250)
    bc = VerticalBarChart()
    bc.x                            = 45            # 整个图表的x坐标
    bc.y                            = 45            # 整个图表的y坐标
    bc.height                       = 200           # 图表的高度
    bc.width                        = 350           # 图表的宽度
    bc.data                         = datas
    bc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色
    bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值
    bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值
    bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长
    bc.groupSpacing                 = 10            # 每组柱状图之间的间隔
    # bc.barSpacing                   = 1           # 每个柱状图之间的间隔
    bc.categoryAxis.labels.dx       = 2             # x和y是x轴下方的标签距离x轴远近的坐标
    bc.categoryAxis.labels.dy       = -8
    bc.categoryAxis.labels.angle    = 20            # x轴上描述文字的倾斜角度
    bc.categoryAxis.categoryNames   = categorys

    bc.bars[0].fillColor = colors.red
    bc.bars[1].fillColor = colors.orange
    bc.bars[2].fillColor = colors.yellow
    bc.bars[3].fillColor = colors.green

    # 图示
    leg = Legend()
    leg.fontName        = 'simsun'
    leg.alignment       = 'left'                    # 文字在色块的左或者右
    leg.boxAnchor       = 'ne'
    leg.x               = 475                       # 图例的x坐标
    leg.y               = 240
    leg.dxTextSpace     = 20                        # 色块与文字之间的间距
    leg.columnMaximum   = len(legends)
    leg.colorNamePairs  = legends
    drawing.add(leg)
    drawing.add(bc)
    return drawing

def main(filename):
    # pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))
    pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))

    doc = SimpleDocTemplate(filename, pagesize=A4)
    Story = []
    datas = [(25400, 12900, 20100, 20300, 20300, 17400), 
              (15800, 9700, 12982, 20100, 13900, 7623),
              (20100, 13900, 9700, 12982, 7623, 15800),
              (12900, 13900, 20300, 9283, 25400, 9700)]
    categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']
    legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]
    Story.append(draw_group_bars1(datas, categorys, legends))
    Story.append(draw_group_bars2(datas, categorys, legends))

    doc.build(Story)

if __name__ == '__main__': 
    main(filename='example.pdf')

在这里插入图片描述

3.2. 多组单条数据

参考:https://dev59.com/uF7Va4cB1Zd3GeqPKod0

from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

from reportlab.graphics.charts.barcharts import VerticalBarChart    # 图表类
from reportlab.graphics.charts.legends import Legend                # 图例类
from reportlab.graphics.shapes import Drawing                       # 绘图工具
from reportlab.graphics.shapes import String
from reportlab.graphics.charts.textlabels import Label

# 多组单条
def draw_group_bar1(datas: list, categorys: list, legends: list):
    drawing = Drawing(500, 280)
    # drawing.add(String(45, 260, "多组单条柱状图", fontSize=14, fontName='simsun', fillColor=colors.black))
    # 配置图表标题
    title = Label()
    title.setText("多组单条柱状图")
    # title.fontSize, title.fontName, title.dx, title.dy = 14, "simsun", 45, 260
    title.fontSize, title.fontName, title.x, title.y = 14, "simsun", 45, 260
    drawing.add(title)

    bc = VerticalBarChart()
    bc.x                            = 45            # 整个图表的x坐标
    bc.y                            = 45            # 整个图表的y坐标
    bc.height                       = 200           # 图表的高度
    bc.width                        = 350           # 图表的宽度
    bc.data                         = datas
    bc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色
    bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值
    bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值
    bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长
    bc.groupSpacing                 = 10            # 每组柱状图之间的间隔
    # bc.barSpacing                   = 1           # 每个柱状图之间的间隔
    bc.categoryAxis.labels.dx       = 2
    bc.categoryAxis.labels.dy       = -8
    # bc.categoryAxis.labels.angle    = 20
    bc.categoryAxis.categoryNames   = categorys

    # 图形柱上标注文字
    # bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置
    bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置
    # bc.barLabelArray                = labels        # 要添加的文字
    # bc.barLabelFormat               = 'values'      # 以字符串类型,还有函数类型,不会用
    # bc.barLabelFormat               = "%0.0f"
    bc.barLabelFormat               = "%d"

    bc.bars[0].fillColor = colors.red
    bc.bars[1].fillColor = colors.orange
    bc.bars[2].fillColor = colors.yellow
    bc.bars[3].fillColor = colors.green

    # 图示
    leg = Legend()
    leg.fontName        = 'simsun'
    leg.alignment       = 'right'                   # 文字在色块的左或者右
    leg.boxAnchor       = 'ne'
    leg.x               = 475                       # 图例的x坐标
    leg.y               = 240
    leg.dxTextSpace     = 10                        # 色块与文字之间的间距
    leg.columnMaximum   = len(legends)
    leg.colorNamePairs  = legends
    drawing.add(leg)
    drawing.add(bc)
    return drawing

def draw_group_bar2(datas: list, labels: list, categorys: list, legends: list):
    drawing = Drawing(500, 280)
    drawing.add(String(45, 260, "多组单条柱状图", fontSize=14, fontName='simsun', fillColor=colors.black))

    bc = VerticalBarChart()
    bc.x                            = 45            # 整个图表的x坐标
    bc.y                            = 45            # 整个图表的y坐标
    bc.height                       = 200           # 图表的高度
    bc.width                        = 350           # 图表的宽度
    bc.data                         = datas
    bc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色
    bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值
    bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值
    bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长
    bc.groupSpacing                 = 10            # 每组柱状图之间的间隔
    # bc.barSpacing                   = 1           # 每个柱状图之间的间隔
    bc.categoryAxis.labels.dx       = 2
    bc.categoryAxis.labels.dy       = -8
    bc.categoryAxis.labels.angle    = 20
    bc.categoryAxis.categoryNames   = categorys

    # 图形柱上标注文字
    # bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置
    bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置
    bc.barLabelArray                = labels        # 要添加的文字
    bc.barLabelFormat               = 'values'      # 以字符串类型,还有函数类型,不会用
    # bc.barLabelFormat               = "%0.0f"

    # 每组0-3条的颜色
    bc.bars[0].fillColor = colors.red
    bc.bars[1].fillColor = colors.orange
    bc.bars[2].fillColor = colors.yellow
    bc.bars[3].fillColor = colors.green

    # 每组第0条 也就是数组中 第一个元组的颜色
    bc.bars[(0,0)].fillColor = colors.yellowgreen
    bc.bars[(0,1)].fillColor = colors.blue
    bc.bars[(0,2)].fillColor = colors.purple
    bc.bars[(0,3)].fillColor = colors.peru
    bc.bars[(0,4)].fillColor = colors.pink
    bc.bars[(0,5)].fillColor = colors.coral

    # 第1组(也就是第二组) 第1条(第二条)
    bc.bars[(1,1)].fillColor = colors.gray

    # 图示
    leg = Legend()
    leg.fontName        = 'simsun'
    leg.alignment       = 'left'                    # 文字在色块的左或者右
    leg.boxAnchor       = 'ne'
    leg.x               = 475                       # 图例的x坐标
    leg.y               = 240
    leg.dxTextSpace     = 10                        # 色块与文字之间的间距
    leg.columnMaximum   = len(legends)
    leg.colorNamePairs  = legends
    # drawing.add(leg)
    drawing.add(bc)
    return drawing

def main(filename):
    # pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))
    pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))

    doc = SimpleDocTemplate(filename, pagesize=A4)
    Story = []
    datas = [(25400, 12900, 20100, 20300, 20300, 17400)]
    categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']
    legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]
    Story.append(draw_group_bar1(datas, categorys, legends))

    datas = [(25400, 12900, 20100, 20300, 20300, 17400),
              (15800, 9700, 12982, 20100, 13900, 7623),]
    labels = [("25400", "12900", "20100", "20300", "20300", "17400"),
              ("15800", "9700", "12982", "20100", "13900", "7623"),]
    categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']
    legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]
    Story.append(draw_group_bar2(datas, labels, categorys, legends))

    doc.build(Story)

if __name__ == '__main__': 
    main(filename='example.pdf')

在这里插入图片描述

3.3. 柱状图累加

from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

from reportlab.graphics.charts.barcharts import VerticalBarChart    # 图表类
from reportlab.graphics.charts.legends import Legend                # 图例类
from reportlab.graphics.shapes import Drawing                       # 绘图工具
from reportlab.graphics.shapes import String
from reportlab.graphics.charts.textlabels import Label

def func(datas: list):
    minv, maxv, tmpv = 0, 0, 0
    # print(len(datas), datas)
    for idxj,val in enumerate(datas[0]):
        tmpv = 0
        for idxi in range(len(datas)):
            tmpv += datas[idxi][idxj]
        # print("#########333", tmpv)
        if tmpv < minv:
            minv = tmpv
        if tmpv > maxv:
            maxv = tmpv

    return minv, maxv

# 柱状图累加
def draw_group_bar1(datas: list, categorys: list, legends: list):
    drawing = Drawing(500, 280)
    # drawing.add(String(45, 260, "柱状图累加", fontSize=14, fontName='simsun', fillColor=colors.black))
    # 配置图表标题
    title = Label()
    title.setText("柱状图累加")
    # title.fontSize, title.fontName, title.dx, title.dy = 14, "simsun", 45, 260
    title.fontSize, title.fontName, title.x, title.y = 14, "simsun", 45, 260
    drawing.add(title)
    width                           = 350
    height                          = 200

    ### 调整step
    minv, maxv = func(datas)
    maxAxis                         = int(height/20)
    # step                            = int((maxv-minv+maxAxis-1)/maxAxis)    # 向上取整
    step                            = int((maxv-minv)/maxAxis)    # 向上取整

    bc = VerticalBarChart()
    bc.x                            = 45            # 整个图表的x坐标
    bc.y                            = 45            # 整个图表的y坐标
    bc.height                       = height        # 图表的高度
    bc.width                        = width         # 图表的宽度
    bc.data                         = datas
    bc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色
    bc.valueAxis.valueMin           = minv          # 设置y坐标的最小值
    bc.valueAxis.valueMax           = maxv*1.2      # 设置y坐标的最大值
    bc.valueAxis.valueStep          = step          # 设置y坐标的步长
    bc.groupSpacing                 = 10            # 每组柱状图之间的间隔
    # bc.barSpacing                   = 1           # 每条柱状图之间的间隔
    bc.categoryAxis.labels.dx       = 2
    bc.categoryAxis.labels.dy       = -8
    bc.categoryAxis.labels.angle    = 20
    bc.categoryAxis.categoryNames   = categorys

    # 图形柱上标注文字
    # bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置
    bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置
    bc.barLabelFormat               = "%0.0f"

    # 柱状图累加
    bc.categoryAxis.style           = 'stacked'

    # 图形柱上标注文字
    # bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置
    bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置
    # bc.barLabelArray                = labels        # 要添加的文字
    # bc.barLabelFormat               = 'values'      # 以字符串类型,还有函数类型,不会用
    # bc.barLabelFormat               = "%0.0f"
    bc.barLabelFormat               = "%d"

    ## 0-3条柱形图的颜色
    # bc.bars[0].fillColor = colors.red
    # bc.bars[1].fillColor = colors.orange
    # bc.bars[2].fillColor = colors.yellow
    # bc.bars[3].fillColor = colors.green

    colorsb = [colors.yellowgreen, colors.blue, colors.purple, colors.peru, colors.pink, colors.coral] 
    colorsg = [colors.red, colors.orange, colors.yellow, colors.green] 
    for idxi in range(len(datas)):
        setattr(bc.bars[idxi], 'fillColor', colorsg[idxi])  # bar_color若含有多种颜色在这里分配bar_color[j]

    # 图示
    leg = Legend()
    leg.fontName        = 'simsun'
    leg.alignment       = 'right'                   # 文字在色块的左或者右
    leg.boxAnchor       = 'ne'
    leg.x               = 475                       # 图例的x坐标
    leg.y               = 240
    leg.dxTextSpace     = 10                        # 色块与文字之间的间距
    leg.columnMaximum   = len(legends)
    leg.colorNamePairs  = legends
    drawing.add(leg)
    drawing.add(bc)
    return drawing

def draw_group_bar2(datas: list, categorys: list, legends: list):
    drawing = Drawing(500, 280)
    drawing.add(String(45, 260, "多组单条柱状图", fontSize=14, fontName='simsun', fillColor=colors.black))

    width                           = 350
    height                          = 200

    # 调整step
    minv, maxv = func(datas)
    maxAxis                         = int(height/20)
    # step                            = int((maxv-minv+maxAxis-1)/maxAxis)    # 向上取整
    step                            = int((maxv-minv)/maxAxis)    # 向上取整

    bc = VerticalBarChart()
    bc.x                            = 45            # 整个图表的x坐标
    bc.y                            = 45            # 整个图表的y坐标
    bc.height                       = height        # 图表的高度
    bc.width                        = width         # 图表的宽度
    bc.data                         = datas
    bc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色
    bc.valueAxis.valueMin           = minv          # 设置y坐标的最小值
    bc.valueAxis.valueMax           = maxv*1.2      # 设置y坐标的最大值
    bc.valueAxis.valueStep          = step          # 设置y坐标的步长
    bc.groupSpacing                 = 10            # 每组柱状图之间的间隔
    # bc.barSpacing                   = 1           # 每条柱状图之间的间隔
    bc.categoryAxis.labels.dx       = 2
    bc.categoryAxis.labels.dy       = -8
    bc.categoryAxis.labels.angle    = 20
    bc.categoryAxis.categoryNames   = categorys

    # 图形柱上标注文字
    # bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置
    bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置
    bc.barLabelFormat               = "%0.0f"

    # 柱状图累加
    bc.categoryAxis.style           = 'stacked'

    colorsb = [colors.yellowgreen, colors.blue, colors.purple, colors.peru, colors.pink, colors.coral] 
    colorsg = [colors.red, colors.orange, colors.yellow, colors.green] 
    for idxi in range(len(datas)):
        for idxj in range(len(datas[0])):
            if idxi == 0:
                setattr(bc.bars[(idxi, idxj)], 'fillColor', colorsb[idxj])
            else:
                setattr(bc.bars[(idxi, idxj)], 'fillColor', colorsg[idxi])

    # 图示
    leg = Legend()
    leg.fontName        = 'simsun'
    leg.alignment       = 'left'                    # 文字在色块的左或者右
    leg.boxAnchor       = 'ne'
    leg.x               = 475                       # 图例的x坐标
    leg.y               = 240
    leg.dxTextSpace     = 10                        # 色块与文字之间的间距
    leg.columnMaximum   = len(legends)
    leg.colorNamePairs  = legends
    # drawing.add(leg)
    drawing.add(bc)
    return drawing

def main(filename):
    # pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))
    pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))

    doc = SimpleDocTemplate(filename, pagesize=A4)
    Story = []
    datas = [(25400, 12900, 20100, 20300, 20300, 17400),
              (15800, 9700, 12982, 20100, 13900, 7623),]
    categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']
    legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]
    Story.append(draw_group_bar1(datas, categorys, legends))
    Story.append(draw_group_bar2(datas, categorys, legends))

    doc.build(Story)

if __name__ == '__main__': 
    main(filename='example.pdf')

在这里插入图片描述

4. 饼状图

5. Image(图像)

6. 常用颜色

在这里插入图片描述

7. 字体与编码

https://blog.csdn.net/qq_40596572/article/details/102896520
字体
https://blog.csdn.net/qtlyx/article/details/99653081

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov8复现

Yolov8的复现流程主要包含环境配置、下载源码和验证环境三大步骤&#xff1a; 环境配置 查看电脑状况&#xff1a;通过任务管理器查看电脑是否有独立显卡&#xff08;NVIDIA卡&#xff09;。若有&#xff0c;后续可安装GPU版本的pytorch以加速训练&#xff1b;若没有&#xff0…

RestSharp和Newtonsoft.Json结合发送和解析http

1.下载RestSharp和Newtonsoft.Json 2编写ApiRequest和ApiResponse和调用工具类HttpRestClient 请求模型 /// <summary>/// 请求模型/// </summary>public class ApiRequest{/// <summary>/// 请求地址/api路由地址/// </summary>public string Route {…

【Pytorch之一】--torch.stack()方法详解

torch.stack方法详解 pytorch官网注释 Parameters tensors&#xff1a;张量序列&#xff0c;也就是要进行stack操作的对象们&#xff0c;可以有很多个张量。 dim&#xff1a;按照dim的方式对这些张量进行stack操作&#xff0c;也就是你要按照哪种堆叠方式对张量进行堆叠。dim的…

数据中台(大数据平台)之数据资源目录

数据资源目录是数据管理的账本&#xff0c;是数据应用的基础&#xff0c;更是是数据治理成果的体现&#xff0c;因此数据中台产品应提供数据资源目录编制、发布、资源挂载、下架的管理能力。 1.数据资源目录分类 资源目录能够支持基于业务特点创建和维护基础目录分类和特色目…

【随身WiFi】随身WiFi Debian系统优化教程

0.操作前必看 本教程基于Debian系统进行优化&#xff0c;有些操作对随身WiFi来说可能会带来负优化&#xff0c;根据需要选择。 所有操作需要在root用户环境下运行&#xff0c;否则都要加sudo 随身wifi Debian系统&#xff0c;可以去某安的随声WiFi模块自行搜索刷机 点赞&am…

JAVA Web_定义Servlet2_学生登录验证Servlet

题目 页面StudentLogin.html中有一HTML的表单代码如下&#xff1a; <form action"studentLogin" method"post">学生姓名&#xff1a;<input type"text" name"stuName" value""><br>登录密码&#xff1a;…

Unity入门笔记(缘更)

内容来源SiKi学院的Luna’s Fantasy 文章目录 一、基础知识1.准备2.基础知识1.层级(Layer)2.轴心点3.预制体(Prefab)4.刚体组件(Rigidbody)5.碰撞器组件(BoxCollider) 二、代码1.移动 一、基础知识 1.准备 Unity安装&#xff1a; https://unity.cn 2.基础知识 1.层级(Layer…

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏&#xff0c;凑近一看…

记录一次生产中mysql主备延迟问题处理

登录库&#xff1a; mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行&#xff1a;show slave status\G 查看 seconds_Behind_Master&#xff0c;延迟 2705s&#xff0c;而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…

ffmpeg无损转格式的命令行

将ffmpeg.exe拖入命令行窗口 c:\users\zhangsan>D:\ffmpeg-2025-03-11\bin\ffmpeg.exe -i happy.mp4 -c:v copy -c:a copy 格式转换后.mkv -c:v copy 仅做拷贝视频,不重新编码 -c:a copy 仅做拷贝音频 ,不重新编码

强化学习算法系列(五):最主流的算法框架——Actor-Critic算法框架

强化学习算法 &#xff08;一&#xff09;动态规划方法——策略迭代算法(PI)和值迭代算法(VI) &#xff08;二&#xff09;Model-Free类方法——蒙特卡洛算法(MC)和时序差分算法(TD) &#xff08;三&#xff09;基于动作值的算法——Sarsa算法与Q-Learning算法 &#xff08;四…

设计模式(结构型)-桥接模式

目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域&#xff0c;随着系统规模和复杂性的不断攀升&#xff0c;如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…

【MySQL】MySQL数据库 —— 简单认识

目录 1. 数据库的介绍 1.1 什么是数据库 1.2 数据库和数据结构之间关系 2. 数据库分类 2.1 关系型数据库&#xff08;RDBMS&#xff09; 2.2 非关系型数据库 2.3 区别 一些行内名词简单解释&#xff1a; 3. 关于mysql 主要学什么 4. MySQL中重要的概念 4.1 概念 4…

RNN - 语言模型

语言模型 给定文本序列 x 1 , … , x T x_1, \ldots, x_T x1​,…,xT​&#xff0c;语言模型的目标是估计联合概率 p ( x 1 , … , x T ) p(x_1, \ldots, x_T) p(x1​,…,xT​)它的应用包括 做预训练模型&#xff08;eg BERT&#xff0c;GPT-3&#xff09;生成本文&#xff…

过拟合、归一化、正则化、鞍点

过拟合 过拟合的本质原因往往是因为模型具备方差很大的权重参数。 定义一个有4个特征的输入&#xff0c;特征向量为,定义一个模型&#xff0c;其只有4个参数&#xff0c;表示为。当模型过拟合时&#xff0c;这四个权重参数的方差会很大&#xff0c;可以假设为。当经过这个模型后…

【python画图】:从入门到精通绘制完美柱状图

目录 Python数据可视化&#xff1a;从入门到精通绘制完美柱状图一、基础篇&#xff1a;快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇&#xff1a;专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …

基础知识:离线安装docker、docker compose

(1)离线安装docker 确认版本:Ubuntu 18.04 LTS - bionic 确认架构:X86_64 lsb_release -a uname -a 官方指南:https://docs.docker.com/engine/install/ 选择Ubuntu,发现页面上最低是Ubuntu20.04, 不要紧

畅游Diffusion数字人(27):解读字节跳动提出主题定制视频生成技术Phantom

畅游Diffusion数字人(0):专栏文章导航 前言:主题定制视频生成,特别是zero-shot主题定制视频生成,一直是当前领域的一个难点,之前的方法效果很差。字节跳动提出了一个技术主题定制视频生成技术Phantom,效果相比于之前的技术进步非常显著。这篇博客详细解读一下这一工作。 …

《Adaptive Layer-skipping in Pre-trained LLMs》- 论文笔记

作者&#xff1a;Xuan Luo, Weizhi Wang, Xifeng Yan Department of Computer Science, UC Santa Barbara xuan_luoucsb.edu, weizhiwangucsb.edu, xyancs.ucsb.edu 1. 引言与动机 1.1 背景 LLM 的成功与挑战: 大型语言模型 (LLMs) 在翻译、代码生成、推理等任务上取得巨大成…

微信小程序实现table样式,自带合并行合并列

微信小程序在代码编写过程好像不支持原生table的使用&#xff0c;在开发过程中偶尔又得需要拿table来展示。 1.table效果展示 1.wxml <view class"table-container"><view class"table"><view class"table-row"><view cla…