【问题标题】:save multiple figures with subplots into a pdf with multiple pages将带有子图的多个图形保存到具有多页的 pdf 中
【发布时间】:2019-11-06 21:48:14
【问题描述】:

我目前有一些这样的代码:

import numpy as np
import matplotlib.pyplot as plt

def generate_data():
    return np.random.randint(10, size=10)

plt.figure(1)
for i in range(4):
    plt.subplot(2, 2, i + 1)
    plt.plot(generate_data())

plt.savefig("C:\\test.pdf")

假设如果要生成 5 个这样的图形,每个图形有 4 张图片。如何将它们保存到具有相同页面的 pdf 中。

我在这里阅读了一些关于如何保存数字的答案。比如这个

Python saving multiple figures into one PDF file

但是,我不明白如何创建所需的数字。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    结合您的代码和您提供的链接,这样可以节省一个 pdf (output.pdf) 的 5 页,并且在每一页上都有一个图形:

    import matplotlib.backends.backend_pdf
    pdf = matplotlib.backends.backend_pdf.PdfPages("output.pdf")
    import numpy as np
    import matplotlib.pyplot as plt
    
    def generate_data():
        return np.random.randint(10, size=10)
    
    figs = []
    n_figs = 5
    
    for j in range(n_figs): # create all figures
    
        plt.figure(j)
        plt.suptitle("figure {}" .format(j+1))
        for i in range(4):
            plt.subplot(2, 2, i + 1)
            plt.plot(generate_data())
    
    for fig in range(0, plt.gcf().number + 1): # loop over all figures
        pdf.savefig( fig ) # save each figure in the pdf
    pdf.close()
    

    编辑:在评论之后,这是在生成大量图形时尝试使用更少内存的版本。我们的想法是在创建每个图形后保存它,然后将其关闭。

    for j in range(n_figs): # create all figures
    
        plt.figure(j)
        plt.suptitle("figure {}" .format(j+1))
        for i in range(4):
            plt.subplot(2, 2, i + 1)
            plt.plot(generate_data())
        pdf.savefig(j) # save on the fly
        plt.close() # close figure once saved
    
    pdf.close()
    
    

    EDIT2:这是第三个版本,我不确定哪个更节省内存。现在的想法是,与其创建和关闭许多图形,不如只创建一个、保存、清除并重用它。

    plt.figure(1) # create figure outside loop
    
    for j in range(n_figs): # create all figures
    
        plt.suptitle("figure {}" .format(j+1))
        for i in range(4):
            plt.subplot(2, 2, i + 1)
            plt.plot(generate_data())
        pdf.savefig(1) # save on the fly
        plt.clf() # clear figure once saved
    
    pdf.close()
    
    

    【讨论】:

    • 最后 3 行正是我所需要的。多谢。我有另一个问题。即,当打开的图形太多时,pycharm 会抱怨内存使用情况。有没有办法解决这个问题?我们可以注意保存图形一旦创建它并以某种方式从缓存中清除它吗?
    • 我添加了第二个版本。让我知道这是否有效。
    • 不错,不错...我想我终于掌握了这个窍门。
    • stackoverflow.com/questions/58751355/… 我问了另一个与此相关的问题。 :)
    • 链接已失效。你的问题在其他地方吗?
    【解决方案2】:

    像这样。

    fig, ax = plt.subplots(2, 2) 
    for i in range(5):
        ax[i].plot(generate_data())
    fig.savefig("C:\\test.pdf")
    

    【讨论】:

    • 你能详细说明一下吗?我不太明白这一点。 ax[i] 是做什么的?
    • 请注意,函数 generate_data() 只是一个虚拟函数,仅用于说明目的。在实践中,我想在 for 循环中绘制每个子图。
    猜你喜欢
    • 2016-12-20
    • 2018-09-28
    • 1970-01-01
    • 2012-05-16
    • 2023-03-29
    • 1970-01-01
    • 2013-07-21
    • 2022-01-01
    相关资源
    最近更新 更多