Matplotlib将savefig保存到PDF的不同页面

14

我有一个很长的图,由几个水平子图组成,排列成一列。

当我调用fig.savefig('what.pdf')时,生成的输出文件显示所有的图都挤在一页上。

问题:是否有一种方法告诉savefig保存到任意数量(可能自动确定)的pdf页面上?

如果可能的话,我宁愿避免使用多个文件,然后os.system('merge ...')。

3个回答

10

我正在处理这个问题。它可以生成一个PDF文件,但仅限于一个。我需要一些时间来解决它,但是嘿,现在已经六点了,所以明天就会解决 :) - astabada
我刚刚确认示例代码生成了一个三页文档,每页都有一张图。 - Pablo Navarro
你必须自己将图表分页,并按照示例编写页面。Matplotlib没有自动分页一系列子图的功能。 - Jouni K. Seppänen
是的,我不得不将图形拆分为不同的“figure”实例,但我可以在我的代码中处理它。 - astabada

1

我在想如何执行类似的操作。我有一组来自不同图像文件的绘图,这些绘图因文件而异。所以我的想法是,一旦我找到了可以在一页中绘制的漂亮的绘图数量,就将其应用于文件。幸运的是,我在这里找到了一个解决方案:http://blog.marmakoide.org/?p=94。然而它并不能正常工作,因为它只绘制第一个面板的绘图,留下其余的面板为空白。我对其进行了修改,并在此处包含了适用于(1XN)网格和输出绘图的工作版本。

import numpy

from matplotlib import pyplot as plot
from matplotlib.backends.backend_pdf import PdfPages

# Generate the data
data = numpy.random.randn(7, 1024)

# The PDF document
pdf_pages = PdfPages('histograms.pdf')

# Generate the pages
nb_plots = data.shape[0]
nb_plots_per_page = 5
nb_pages = int(numpy.ceil(nb_plots / float(nb_plots_per_page)))
grid_size = (nb_plots_per_page, 1)

for i, samples in enumerate(data):
  print
  print i,i % nb_plots_per_page,samples
  # Create a figure instance (ie. a new page) if needed
  if i % nb_plots_per_page == 0:
    print 'Opening'
    fig = plot.figure(figsize=(8.27, 11.69), dpi=100)
  # Close the page if needed
  elif (i + 1) % nb_plots_per_page == 0 or (i + 1) == nb_plots:
    plot.subplot2grid(grid_size, (i % nb_plots_per_page, 0))
    plot.hist(samples, 32, normed=1, facecolor='#808080', alpha=0.75)
    plot.title(str(i+1))

    plot.tight_layout()
    pdf_pages.savefig(fig)
    print 'Closing'
    print i,samples
    # Plot stuffs !
  print i,samples
  plot.subplot2grid(grid_size, (i % nb_plots_per_page, 0))
  plot.hist(samples, 32, normed=1, facecolor='#808080', alpha=0.75)
  plot.title(str(i+1))


# Write the PDF document to the disk
pdf_pages.close()
print 'histograms.pdf'

Page1

Page2


1

我怀疑有更优雅的方法来完成这个任务,但其中一个选项是使用临时文件或StringIO来避免在系统上创建传统文件,然后您可以将它们拼接在一起。


你不能简单地将PDF文件连接起来,然后期望结果是一个有效的PDF文件,其中包含组成页面。 - Jouni K. Seppänen
不,我也没有意思暗示你可以这样做,尽管我能理解它可能被误读了。但是有很多像pyPdf这样的工具可以让你将多个PDF文件拼接在一起。 - TimothyAWiseman
是的,他的回答比我的晚。我同意他做得很好。我很高兴提到pyPdf有所帮助。 - TimothyAWiseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接