1

我已经解决这个问题很长时间了,但我无法找到答案。

所以,我有一个要绘制的矩阵列表(为了这个问题,我只有 2 个随机矩阵:

list = [np.random.random((500, 500)), np.random.random((500, 500))]

然后,我想matshow在 pdf 文件的单独页面中绘制列表的每个元素:

with PdfPages('file.pdf') as pdf:
    plt.rc('figure', figsize=(3,3), dpi=40)
    for elem in list:
        plt.matshow(elem, fignum=1)
        plt.title("title")
        plt.colorbar()
        plt.text(0,640,"Caption")
        pdf.savefig()  # saves the current figure into a pdf page
        plt.close()

结果如下: 在此处输入图像描述

我的问题是标题。你可以看到我故意把“Caption”放在文档的边缘。这是因为有时我想要插入的实际标题太大而无法放入单个 pdf 页面。

那么,如何使每个 pdf 页面都可以根据标题的内容进行调整(每个页面可能会有所不同)?例如,是否可以将每个页面大小设置为 A4 或 A3,然后在每个页面中绘制/写入所有内容?

我已经尝试过设置plt.figure(figsize=(X, X))可变X大小,但我猜它只是改变了 pdf 的分辨率。

4

2 回答 2

1

您可能希望bbox_inches="tight"在保存文件时使用该选项。这将使图形大小适应其内容。因此,只需将一些文本放置(0,0)在图形坐标中的位置并将其与顶部对齐即可。然后这将延伸到图形的底部和外部(因此屏幕上显示的图形将不包含该文本),但使用bbox_inches="tight"savefig 选项,保存的图形将变得足够大以包含该文本。
使用 textwrap 包还可以限制水平方向的文本。

import numpy as np; np.random.seed(1)
import textwrap 
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

p = np.ones(12); p[0] = 7
text2 = "".join(np.random.choice(list(" abcdefghijk"),p=p/p.sum(), size=1000))
text2 = textwrap.fill(text2, width=80)
texts = ["Caption: Example", "Caption 2: " + text2 ]

lis = [np.random.random((500, 500)), np.random.random((500, 500))]

with PdfPages('file.pdf') as pdf:
    for elem,text in zip(lis,texts):
        fig = plt.figure(dpi=100)

        grid_size = (3,1)

        plt.imshow(elem)
        plt.title("title")
        plt.colorbar()

        fig.text(0,0, text, va="top")

        plt.tight_layout()
        pdf.savefig(bbox_inches="tight")
        plt.close()

在此处输入图像描述

于 2017-12-01T18:12:53.137 回答
0

我想我自己已经想出了这个问题的答案,它解决了我的文本有足够空间的问题:

但是,一个完美的答案是根据我放置的标题数量使每个页面的大小动态化。

无论如何,我的答案如下(我基本上将每一页分成 3 行的网格,将上面的 2 行用于绘图,最后一行用于标题):

with PdfPages('file.pdf') as pdf:
    for elem in list:
        fig = plt.figure(figsize=(8.27, 11.69), dpi=100)

        grid_size = (3,1)

        plt.subplot2grid(grid_size, (0, 0), rowspan=2, colspan=1)

        plt.imshow(elem)
        plt.title("title")
        plt.colorbar()

        plt.subplot2grid(grid_size, (2, 0), rowspan=2, colspan=1)
        plt.axis('off')
        plt.text(0,1,"Caption")

        plt.tight_layout()
        pdf.savefig()
        plt.close()

在每个页面中产生以下内容: 在此处输入图像描述

有人能找到更好的解决方案吗?:)

于 2017-12-01T17:18:08.143 回答