2012-10-17 11 views
7

Ho una trama lunga, composta da diverse sottotrame orizzontali organizzate in una colonna.Salvataggio di Matplotlib in diverse pagine di un PDF

Quando chiamo fig.savefig ('what.pdf'), il file di output risultante mostra tutti i grafici stipati su una singola pagina.

Domanda: c'è un modo per dire a savefig di salvare su qualsiasi numero (possibilmente determinato automaticamente) di pagine PDF?

Preferisco evitare più file e quindi os.system ('unione ...'), se possibile.

risposta

6

Non ho provato me stesso, ma nel file matplolib faq ci sono alcune istruzioni per salvare i grafici in pdf in diverse pagine.

+0

Ci sto lavorando. Produce un pdf, ma ancora solo uno. Ho bisogno di un po 'di tempo per capirlo, ma hey, sono le sei qui, quindi succederà domani :) – astabada

+0

Ho appena confermato che il codice di esempio ha prodotto un documento di tre pagine, con una figura in ogni pagina. –

+0

È necessario suddividere i grafici nelle pagine e scrivere le pagine come mostrato nell'esempio. Non c'è funzionalità in matplotlib per impaginare automaticamente una serie di sottotrame. –

1

Ho il sospetto che ci sia un modo più elegante per farlo, ma una delle opzioni è usare tempfile o StringIO per evitare di creare file tradizionali sul sistema e poi metterli insieme.

+0

Non si può semplicemente concatenare i file pdf e si aspettano che il risultato sia un file PDF valido con le pagine costituenti. –

+0

No, non intendevo suggerire di poterlo fare, anche se posso vedere come potrebbe essere letto in questo modo. Ma ci sono una serie di strumenti come pyPdf che ti permettono di ricamare più file PDF insieme. – TimothyAWiseman

+0

Sì, la sua risposta è arrivata dopo la mia. Sono d'accordo che l'ha inchiodato. Sono felice che la citazione di pyPdf sia stata d'aiuto. – TimothyAWiseman

0

mi chiedevo come eseguire una cosa simile. Ho un set di grafici provenienti da diversi file di immagine, che variano a seconda del file. Quindi l'idea è, una volta trovato un buon numero di grafici che possono essere tracciati in una pagina, applicare questo per i file. Fortunatamente, ho trovato una soluzione suggerita qui: http://blog.marmakoide.org/?p=94. Tuttavia non funziona correttamente, poiché traccia solo i primi grafici del pannello, lasciando il resto dei pannelli vuoto. L'ho modificato e qui includo una versione funzionante per una griglia (1XN) e i grafici di output.

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

Problemi correlati