сохранить несколько рисунков с сюжетами в формате PDF с несколькими страницами - PullRequest
0 голосов
/ 07 ноября 2019

В настоящее время у меня есть некоторый код, подобный этому:

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, сохраняющий несколько рисунков в один файл PDF

Однако я не понимаю, как создать необходимые рисунки.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Комбинируя ваш код и ссылку, которую вы дали, это сохраняет один 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()

0 голосов
/ 07 ноября 2019

Вот так.

fig, ax = plt.subplots(2, 2) 
for i in range(5):
    ax[i].plot(generate_data())
fig.savefig("C:\\test.pdf")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...