Python 3.x 多页pdf中matshow()的标题

Python 3.x 多页pdf中matshow()的标题,python-3.x,matplotlib,pdfpages,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) f

这个问题我已经讨论了很长一段时间,但我找不到答案

所以,我有一个矩阵列表,我想画出来(为了这个问题,我有两个随机矩阵:

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()
结果如下:

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

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


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

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

然而,一个完美的答案是根据我放的标题的数量,使每一页的大小动态变化

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

在每个页面中生成以下内容:


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

保存文件时,您可能需要使用
bbox\u inches=“tight”
选项。这将使图形大小适应其内容。因此,在地物坐标中的位置
(0,0)
放置一些文本并将其与顶部对齐就足够了。这将延伸到图形的底部和外部(因此屏幕上显示的图形将不包含该文本),但使用savefig的
bbox\u 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()

谢谢,这正是我想要的!
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()