matshow()的标题在多页pdf中

时间:2017-12-01 16:49:56

标签: python-3.x matplotlib pdfpages

我已经解决了这个问题很长一段时间但是我找不到答案。

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

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

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

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()

结果如下: enter image description here

我的问题在于标题。您可以看到我故意将“标题”放在文档的边缘。这是因为有时我想插入的实际字幕太大而不适合单个pdf页面。

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

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

2 个答案:

答案 0 :(得分:1)

保存文件时,您可能希望使用bbox_inches="tight"选项。这将使图形大小适应其内容。因此,在图形坐标中将一些文本放置在位置(0,0)并将其与顶部对齐就足够了。然后这将扩展到图的底部和外部(因此屏幕上显示的图形不包含该文本),但使用savefig的bbox_inches="tight"选项,保存的图形将变得足够大以包含该文本。
然后,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()

enter image description here

答案 1 :(得分:0)

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

然而,根据我提出的标题数量,一个完美的答案是让每个页面的大小动态。

无论如何,我的回答如下(我基本上将每个页面划分为3行,网格的上面两行,最后只是标题):

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()

在每个页面中生成以下内容: enter image description here

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