Matplotlib создает подзаговоры из фигур, сгенерированных в цикле for - PullRequest
0 голосов
/ 28 января 2019

Я новичок в python, и, несмотря на то, что здесь я изучил множество потоков подзаговоров, я все еще не могу найти свое решение.

Я пытаюсь сгенерировать 2-страничный PDF-файл с 2 субплотами на страницу.В моем коде я загружаю 4 набора данных (2 столбца чисел в каждом файле), а затем для каждого набора я создаю график.Это работает нормально, но я не могу распределить эти графики в двух цифрах (страницах) по 2 графика на страницу.

Это то, что я пытался сделать, но вместо того, чтобы получить одну фигуру с 2 субплотами, я получаю только второй график (сейчас я пытался получить только одну страницу с 2 субплотами).

У кого-нибудь из вас есть предложения?

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages

with PdfPages ('subplot.pdf') as pdf:

    for i in range(1,5):
        x = []
        y = []
        with open('data{}.txt'.format(i)) as data:
            data = data.readlines()
            for row in data:
                x.append(row.split()[0])
                y.append(row.split()[1])

            fig = plt.figure()
            plt.plot(x,y)
            plt.xticks([])
            plt.yticks([])
            plt.title('Data {}'.format(i))
    fignum = plt.get_fignums()
    print(fignum)

    plt.subplot(2,1,1)
    plt.figure(fignum[0])
    plt.subplot(2,1,2)
    plt.figure(fignum[1])

    pdf.savefig()
    plt.close()

1 Ответ

0 голосов
/ 28 января 2019

Возможно, вы неправильно поняли пример многостраничного pdf .Вам нужно будет создать одну фигуру на страницу и добавить две оси на фигуру.Для лучшего понимания, может быть, этот псевдокод более полезен:

loop over pages
    create figure
    loop over axes inside of figure
        plot to axes
    save figure

В действительности это может выглядеть так:

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages

def get_data(n):
    #return np.loadtxt('data{}.txt'.format(n), unpack=True)
    return np.random.rand(2,10)


with PdfPages ('subplot.pdf') as pdf:
    # loop for pages
    for i in [1,3]:
        # create a figure
        fig, axes = plt.subplots(nrows=2)
        # loop over axes
        for j in [0,1]:
            x,y = get_data(i+j)

            axes[j].plot(x,y)
            axes[j].set(xticks=[], yticks=[])
            axes[j].set_title('Data {}'.format(i+j))
        # append figure to pdf
        pdf.savefig(fig)
        plt.close()

enter image description here

...