Python matplotlib: сохранить в pdf на нескольких страницах

Я пытаюсь сделать следующее:

Я создал фигуру, используя matplotlib, с несколькими подзаголовками. Более конкретно, подсечки 2×4

Выход отлично подходит для показа на экране, но не для сохранения его в формате pdf.

Если я просто использую save_fig , он печатает одностраничный документ pdf с сеткой 2×4.

То, что я хотел бы сделать, заключается в перераспределении моих подзаговоров, скажем, в сетке 2×4 (выбор того, какой подзаговор идет, где бы это было хорошо, но не обязательно) и печатать его на двухстраничном pdf-формате с 4 подзаголовками каждый. (чтобы учесть его размер A4)

Это возможно?

Заранее благодарю!

  • Извлечение текста из файла PDF с использованием Python
  • Как сохранить цифры в pdf как растровые изображения в matplotlib
  • PythonMagick не может найти мои файлы PDF
  • Преобразование PDF в ряд изображений с помощью Python
  • pyPdf для извлечения IndirectObject
  • Python PDFMIner - PDF для CSV
  • 2 Solutions collect form web for “Python matplotlib: сохранить в pdf на нескольких страницах”

    Я бы предложил создать 3 цифры. Один для показа и 2 для сохранения и печати одинаковых данных.

     import matplotlib.pyplot as plt import numpy as np data = np.sort(np.cumsum(np.random.rand(24,16), axis=0), axis=0) def plot(ax, x, y, **kwargs): ax.plot(x,y, **kwargs) colors = ["crimson", "indigo", "limegreen", "gold"] markers = ["o", "", "s", ""] lines = ["", "-", "", ":"] # figure 0 for showing fig0, axes = plt.subplots(nrows=2,ncols=4) for i, ax in enumerate(axes.flatten()): plot(ax, data[:,2*i], data[:,2*i+1], marker=markers[i%4], ls=lines[i%4],color=colors[i%4]) # figure 1 for saving fig1, axes = plt.subplots(nrows=1,ncols=4) for i, ax in enumerate(axes.flatten()): plot(ax, data[:,2*i], data[:,2*i+1], marker=markers[i], ls=lines[i],color=colors[i]) #figure 2 for saving fig2, axes = plt.subplots(nrows=1,ncols=4) for i, ax in enumerate(axes.flatten()): plot(ax, data[:,2*i+4], data[:,2*i+1+4], marker=markers[i], ls=lines[i],color=colors[i]) #save figures 1 and 2 fig1.savefig(__file__+"1.pdf") fig2.savefig(__file__+"2.pdf") #close figures 1 and 2 plt.close(fig1) plt.close(fig2) #only show figure 0 plt.show() 

    Поскольку мне нужна была что-то подобное для моей работы, я приложил некоторые усилия для автоматизации процесса группировки графиков на фигуры в зависимости от среды отображения. Сначала у меня была идея делать каждый сюжет только один раз и просто добавлять подзаголовки к цифрам, которые нужно сохранить в pdf, но, к сожалению, согласно комментарию в этом ответе , это невозможно, поэтому все нужно переделать, график. Код показывает общее представление о том, как это можно автоматизировать с помощью PdfPages :

     from matplotlib import pyplot as plt import numpy as np from matplotlib.backends.backend_pdf import PdfPages def niter(iterable, n): """ Function that returns an n-element iterator, ie sub-lists of a list that are max. n elements long. """ pos = 0 while pos < len(iterable): yield iterable[pos:pos+n] pos += n def plot_funcs(x, functions, funcnames, max_col, max_row): """ Function that plots all given functions over the given x-range, max_col*max_row at a time, creating all needed figures while doing so. """ ##amount of functions to put in one plot N = max_col*max_row ##created figures go here figs = [] ##plotted-on axes go here used_axes = [] ##looping through functions N at a time: for funcs, names in zip(niter(functions, N), niter(funcnames,N)): ##figure and subplots fig, axes = plt.subplots(max_col, max_row) ##plotting functions for name,func,ax in zip(names, funcs, axes.reshape(-1)): ax.plot(x, func(x)) ax.set_title(name) used_axes.append(ax) ##removing empty axes: for ax in axes.reshape(-1): if ax not in used_axes: ax.remove() fig.tight_layout() figs.append(fig) return figs ##some functions to display functions = [ lambda x: x, lambda x: 1-x, lambda x: x*x, lambda x: 1/x, #4 np.exp, np.sqrt, np.log, np.sin, np.cos, #5 ] funcnames = ['x','1-x', 'x$^2$', '1/x', 'exp', 'sqrt', 'log', 'sin','cos'] ##layout for display on the screen disp_max_col = 3 disp_max_row = 2 ##layout for pdf pdf_max_col = 2 pdf_max_row = 4 ##displaying on the screen: x = np.linspace(0,1,100) figs = plot_funcs(x, functions, funcnames, disp_max_row, disp_max_col) plt.show() ##saving to pdf if user wants to: answer = input('Do you want to save the figures to pdf?') if answer in ('y', 'Y', 'yes', ''): ##change number of subplots N = disp_max_col*disp_max_row figs = plot_funcs(x, functions, funcnames, pdf_max_row, pdf_max_col) ##from https://matplotlib.org/examples/pylab_examples/multipage_pdf.html with PdfPages('multipage_pdf.pdf') as pdf: for fig in figs: plt.figure(fig.number) pdf.savefig() 

    Основная функция plot_funcs принимает ключевые слова max_col и max_row а затем создает цифры с соответствующим количеством подзаговоров. Затем он проходит через заданный список функций, которые должны быть построены, каждый на своем собственном подзаголовке. Удалены неиспользуемые подзаголовки. Наконец, возвращается список всех цифр.

    В моем примере у меня есть 9 различных функций, которые я сначала показываю на экране в макете 2×3 (в общей сложности две цифры, одна с 6 подзаголовками и одна с тремя подзаголовками). Если пользователь счастлив, графики перерисовываются в макете 2×4 (опять две цифры, но на этот раз одна с 8 подзаголовками и 1 с 1 подзаголовком), а затем сохраняется в файле multipage_pdf.pdf , следуя примеру в документации .

    Протестировано на python 3.5

    Python - лучший язык программирования в мире.