2012-10-17 129 views
7

我有一个冗长的图表,由几个组成列的水平子图组成。Matplotlib savefig插入PDF的不同页面

当我打电话给fig.savefig('what.pdf')时,生成的输出文件显示所有插入单个页面的图表。

问题:有没有办法告诉savefig保存任何数量(可能自动确定)的PDF页面?

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

回答

6

我还没有尝试过自己,但在matplolib常见问题解答中有一些指令可以在几页中保存pdf格式的图表。

+0

我正在为此工作。它生成一个pdf,但仍然只有一个。我需要一些时间来弄清楚,但是,嘿,这里是六个,所以明天就会发生:) – astabada

+0

我刚刚确认示例代码生成了三页文档,每页都有一个数字。 –

+0

您必须自己将图块分成页面并按照示例中所示编写页面。 matplotlib没有自动分页一系列子图的功能。 –

1

我怀疑有一种更优雅的方式来做到这一点,但一种选择是使用tempfiles或StringIO来避免在系统上创建传统文件,然后您可以将它们拼接在一起。

+0

你不能只是串联的PDF文件,并希望得到的结果与组成页有效的PDF文件。 –

+0

不,我也不是想要建议你可以,但我可以看到它是如何被读取的。但是有很多像pyPdf这样的工具可以让你将多个PDF文件拼接在一起。 – TimothyAWiseman

+0

是的,他的回答是在我的后面。我同意他钉了它。我很高兴提到pyPdf的帮助。 – TimothyAWiseman

0

我不知道如何执行类似的事情。我有一组来自不同图像文件的图形,这些图像文件有所不同。所以这个想法是,一旦我找到了可以在一个页面中绘制的很好的图表,就可以将它应用于这些文件。幸运的是,我在这里找到了一个解决方案: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