2012-12-25 6 views
6

Per un articolo sto generando trame di mesh di elementi finiti deformati, che visualizzo usando la polycollection di matplotlib. Le immagini vengono salvate come pdf.rasterizzazione del contenuto dell'asse matplotlib (ma non frame, etichette)

I problemi sorgono per le mesh ad alta densità, per le quali l'approccio ingenuo risulta in file troppo grandi e troppo intensivi per essere pratici.

Per queste mesh non ha senso tracciare ogni elemento come un poligono; potrebbe essere facilmente rasterizzato, come si fa quando si salva l'immagine come jpg o png. Tuttavia, per la stampa mi piacerebbe conservare una cornice nitida, etichette e annotazioni.

Qualcuno sa se è possibile ottenere questo tipo di rasterizzazione ibrida in matplotlib?

Posso pensare a soluzioni che coinvolgono imshow e bypassare la polycollection, ma preferirei molto preferibilmente usare i componenti incorporati di matplotlib.

Grazie per il vostro consiglio.

risposta

9

Basta passare la parola chiave rasterized=True al costruttore della raccolta. Esempio:

col = collections.PolyCollection(<arguments>, rasterized=True) 

Questo permette un rasterizzazione selettivo di tale elemento unico (ad esempio, se avete fatto una trama normale su di esso, sarebbe vettorializzare per impostazione predefinita). La maggior parte dei comandi come plot o imshow possono anche utilizzare la parola chiave rasterized. Se si vuole rasterizzare tutta la figura (incluse le etichette e le annotazioni), questo lo farebbe:

fig = plt.figure() 
a = fig.add_subplot(1,1,1, rasterized=True) 

(Ma questo non è ciò che si vuole, come indicato nella domanda.)

+0

Wow, così semplice . Mi preoccupo delle mie capacità di googling ora. Ma grazie mille per questa risposta, questo è esattamente quello che speravo! – gertjan

+0

Questo è fantastico! Qualche idea su come controllare il dpi della rasterizzazione, comunque? Sembra ignorare il dpi che passo a 'figure' e' savefig' ... – weronika

+0

@weronika, se il dpi in 'figure' o' savefig' non funziona, quindi non so davvero come cambiarlo . 'collections' sembra utilizzare il decoratore dell'artista' allow_rasterization', ma da un rapido sguardo al codice non ho potuto vedere come impostare un dpi. – tiago