2013-07-18 9 views
8

Quindi, sto tracciando una forma d'onda (e altre cose) che risulta in un file vettoriale (PDF) più grande del corrispondente file raster (PNG). Immagino che questo sia perché il set di dati tracciato è molto grande e ci sono milioni di istruzioni nel file vettoriale. Oltre ad essere più grande, il PDF è anche abbastanza difficile da visualizzare per il lettore PDF. Su alcuni, ci vogliono alcuni secondi per caricare; sugli altri, non si carica affatto.trama bitmap matplotlib con testo vettoriale

In pyplot, è possibile avere un grafico bitmap con assi vettoriali, etichette e tutto il resto del testo?

La mia (pessima) soluzione al momento è generare il PDF, generare il PNG, aprire il PDF con inkscape e sostituire il grafico con quello PNG. Ovviamente questo è troppo manuale e richiede molto tempo se ti rendi conto che devi rigenerare la trama.

+0

Leggendo i commenti dettagliati di un recente (in corso?) Sondaggio matplotlib, un'altra persona ha fatto questa stessa richiesta. https://docs.google.com/spreadsheet/ccc?key=0AjrPjlTMRTwTdHpQS25pcTZIRWdqX0pNckNSU01sMHc&usp=sharing – esmit

risposta

10

Dovrebbe essere semplice come passare in rasterized=True al comando plot.

E.g.

import matplotlib.pyplot as plt 

plt.plot(range(10), rasterized=True) 
plt.savefig('test.pdf') 

Per me, questo si traduce in un pdf con una linea rasterizzato (la risoluzione è controllata dalla dpi specificato con savefig - per impostazione predefinita, è 100) e testo vettoriale.

+0

Mi sono appena accorto di non averlo mai contrassegnato come risposta corretta, anche se lo utilizzo da allora. È esattamente quello che stavo cercando, non so come l'ho perso nei documenti. Molte grazie! – gozzilli

1

Io uso una "correzione" sporca per questo problema. Semplicemente produco la trama due volte. Una volta rimossi tutti i frame, i titoli, ecc. E salvando come png e nell'altro caso, rimuovo i dati effettivi e salvi tutti i componenti che voglio come dati vettoriali in un pdf. Quindi uso ImageMagick per convertire il png in un pdf contenente dati bitmap e sovrapposto i dati vettoriali dal pdf usando pdftk. Ecco un esempio di pcolor dalla pagina matplotlib adattato nel modo in cui ho appena descritto.

import matplotlib.pyplot as plt 
import numpy as np 
import os 

for case in ['frame','data']: 

    # make these smaller to increase the resolution                         
    dx, dy = 0.02, 0.02 

    # generate 2 2d grids for the x & y bounds                          
    y, x = np.mgrid[slice(-3, 3 + dy, dy), 
        slice(-3, 3 + dx, dx)] 
    z = (1 - x/2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2) 
    # x and y are bounds, so z should be the value *inside* those bounds.                    
    # Therefore, remove the last value from the z array.                        
    z = z[:-1, :-1] 
    z_min, z_max = -np.abs(z).max(), np.abs(z).max() 


    fig=plt.figure() 
    ax=fig.add_subplot(1,1,1) 
    im=plt.pcolor(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max) 
    plt.title('pcolor') 
    # set the limits of the plot to the limits of the data                       
    plt.axis([x.min(), x.max(), y.min(), y.max()]) 

    if case is 'frame': 
     im.remove() 
     plt.savefig("frame.pdf",transparent=True) 
    if case is 'data': 
     ax.axison=False 
     plt.title('') 
     plt.savefig("data.png",transparent=True) 



os.system('convert data.png data.pdf') 
os.system('pdftk frame.pdf background data.pdf output final_plot.pdf') 
os.system('rm data.png data.pdf frame.pdf') 

in fondo è solo una versione automatizzata di ciò che si sta già facendo ...

+1

Bel trucco, ma la risposta di @Joe Kington è semplice e pulita. Consiglio vivamente di provare questa opzione! – gozzilli

+0

Vero, davvero. Rende le cose più facili Mi rendo conto di avere un'idea sbagliata di ciò che fa questa opzione di rasterizzazione ... –