2012-10-17 130 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