如何使用python将dict保存为带有单元格着色的PDF表格?

2024-10-02 22:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dict变量来总结我的实验错误,定义如下:

my_dict= {' ': ['A error', 'B Error', 'C Error', 'D Error'], 'lab1': [0.34, 0.23, 80, 0.79], 'lab2': [0.53, 0.38, 96, 1.25], 'lab3': [0.40, 0.27, 68, 0.93]}

Python中有没有办法将上述dict保存为PDF格式的表?在这里,我希望为这些值分配一些阈值:如果错误值大于阈值,则单元格为红色,否则为绿色

例如,在上表“my_dict”中,我希望为不同的单元格设置不同的阈值。有人能提供一些指导吗


Tags: 定义pdfmy格式错误阈值errordict
2条回答

免责声明:我是pText的作者

您可以使用pText创建您描述的PDF。 让我们先创建一个空的Document

    # create document
    pdf = Document()

    # add page
    page = Page()
    pdf.append_page(page)

我们将使用布局管理器来确定内容需要放在哪里。这比我们自己尝试计算PDF坐标系要容易得多

    # set layout
    layout = SingleColumnLayout(page)

接下来是有趣的部分,实际处理数据:

    my_dict= {' ': ['A Error', 'B Error', 'C Error', 'D Error'],
              'lab1': [0.34, 0.23, 0.80, 0.79],
              'lab2': [0.53, 0.38, 0.96, 1.25],
              'lab3': [0.40, 0.27, 0.68, 0.93]}

我将定义一个字典来将边界映射到颜色。您可以轻松地更改这段代码以添加更多颜色,或者更改颜色

    colors = {0: X11Color("Green"),
              0.25: X11Color("Yellow"),
              0.5: X11Color("Orange"),
              0.75: X11Color("Red")}

接下来我们创建Table

    table = Table(number_of_rows=4, number_of_columns=5)

现在我们可以在表上调用add。无论何时,内容都会添加到当前行(从顶行开始)。如果该行已满,我们将自动转到下一行

    table.add(Paragraph(" "))

现在,我们添加所有标题(我将其加粗):

    for h in my_dict[" "]:
        table.add(Paragraph(text=h, font="Helvetica-Bold", font_size=Decimal(12)))

下一步是将所有数据实际添加到Table

    for name, row in [(k,v) for k,v in my_dict.items() if k != " "]:
        table.add(Paragraph(name))
        for v in row:
            c = X11Color("Green")
            for b,bc in colors.items():
                if v > b:
                    c = bc
            table.add(Paragraph(str(v),
                                font_color=c,
                                justification=Justification.CENTERED))

我将使这个Table上的边界比默认情况下的边界薄一点:

    # set border
    table.set_border_width_on_all_cells(Decimal(0.2))

我还将在Page的开头添加一个Paragraph,以提供有关该表所表示内容的上下文:

    # add to layout
    layout.add(Paragraph("This table contains all measurands for 3 lab-sessions."))

现在我们将Table添加到Page

    layout.add(table)

最后,我们存储PDF:

    # attempt to store PDF
    with open("output.pdf", "wb") as in_file_handle:
        PDF.dumps(in_file_handle, pdf)

最终结果如下所示(但您可以随意使用颜色、字体等)

enter image description here

您可以创建熊猫数据框,然后显示海生热图:

import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt

my_dict= {' ': ['A error', 'B Error', 'C Error', 'D Error'], 'lab1': [0.34, 0.23, 80, 0.79], 'lab2': [0.53, 0.38, 96, 1.25], 'lab3': [0.40, 0.27, 68, 0.93]}
df = pd.DataFrame(my_dict)
df.set_index(' ', inplace=True)
sns.heatmap(df.T, cmap='RdYlGn', annot=True, cbar_kws={'label':'Error value'})
plt.savefig('Errors.pdf')
plt.show()

resulting plot

相关问题 更多 >