2013-04-04 16 views
5

sto generando una trama di contorno depositato presso la funzione matplotlib.pyplot.contourf(). Gli argomenti nella chiamata alla funzione sono:Aliasing durante il salvataggio matplotlib riempita trama di contorno al pdf o eps

contourf(xvec,xvec,w,levels,cmap=matplotlib.cm.jet) 

dove

xvec = numpy.linspace(-3.,3.,50) 
levels = numpy.linspace(-0.01,0.25,100) 

e w è i miei dati.

La trama risultante sembra abbastanza buona sullo schermo, ma quando salgo in pdf utilizzando una chiamata a matplotlib.pyplot.savefig(), il pdf risultante ha un sacco di aliasing (penso che sia quello che è) in corso . La chiamata a savefig è semplicemente savefig('filename.pdf'). Ho provato a utilizzare l'argomento dpi, ma senza fortuna. Una chiamata a matplotlib.get_backend() sputa fuori 'TkAgg'.

farò attaccare una figura salvato in formato pdf, rispetto a un dato salvato come png (simile a quello che sembra sullo schermo) per dimostrare il problema:

png wihtout aliasing: https://dl.dropbox.com/u/6042643/wigner_g0.17.png

pdf con aliasing: https://dl.dropbox.com/u/6042643/wigner_g0.17.pdf

Per favore fatemi sapere se ci sono altri dettagli che potrei dare per aiutarvi a dare una risposta. Dovrei ricordare che il salvataggio come .eps dà risultati analoghi come il salvataggio in pdf. Ma il pdf mostra il problema ancora più chiaro. Il mio obiettivo è quello di finire con un Eps di qualità di produzione che posso allegare a un documento in lattice per essere pubblicato come articolo scientifico. Sarei felice con un certo tipo di lavoro intorno dove li risparmio in un formato, quindi convertirlo, se riesco a trovare un modo che dà risultati soddisfacenti.

migliore,

Arne

+0

Quelli sembrano [moiré] (https://en.wikipedia.org/wiki/Moir%C3%A9_pattern) a me. Con il pdf il modello cambia in base al livello di zoom. – tacaswell

+2

@arne: i file collegati sono andati - c'è qualche possibilità di sostituirli? –

risposta

5

Dopo aver utilizzato per un po 'la risposta utile di @pelson, ho finalmente trovato una soluzione adeguata a questo problema di vecchia data (attualmente in Matplotlib 2.0), che non richiede più chiamate per contornare o rasterizzare la figura.

Mi riferisco alla mia risposta originale here per una spiegazione più ampia ed esempi.

In sintesi, la soluzione è costituita dalle seguenti linee:

cnt = plt.contourf(x, y, z) 

for c in cnt.collections: 
    c.set_edgecolor("face") 

plt.savefig('test.pdf') 
6

Non avevo idea che contornatura in pdf era così male. Hai ragione, penso che i contorni sono in corso di anti-aliasing per i renderer PDF al di fuori di matplotlib. Per questo motivo penso che sia necessario prestare particolare attenzione a quale applicazione si utilizza per visualizzare il PDF risultante: il miglior comportamento che ho visto è con GIMP, ma sono sicuro che ci sono molti altri spettatori che funzionano bene.

per risolvere questo problema (quando si visualizza il PDF con GIMP), sono stato in grado di "rasterizzare" i contorni prodotti con matplotlib per evitare il brutto problema linea bianca:

import matplotlib.pyplot as plt 
import numpy as np 


xs, ys = np.mgrid[0:30, 0:40] 
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2 

cs = plt.contourf(xs, ys, data, 60, cmap='jet') 

# Rasterize the contour collections 
for c in cs.collections: 
    c.set_rasterized(True) 

plt.savefig('test.pdf') 

Questo ha prodotto una trama di contorno, che non ha mostrato i problemi che hai mostrato.

Un'altra alternativa, forse migliore, sarebbe ingannare l'anti-aliasing mettendo linee colorate sotto il contorno.

import matplotlib.pyplot as plt 
import numpy as np 


xs, ys = np.mgrid[0:30, 0:40] 
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2 

# contour the plot first to remove any AA artifacts 
plt.contour(xs, ys, data, 60, cmap='jet', lw=0.1) 
cs = plt.contourf(xs, ys, data, 60, cmap='jet') 

plt.savefig('test.pdf') 

Vorrei sottolineare che non vedo questi problemi se risparmio il dato come un ".ps" piuttosto che un ".pdf" - forse è una terza alternativa.

Spero che questo ti aiuta a ottenere la carta cercando esattamente come si desidera.

+1

Ciao pelson. Sono andato per la tua seconda soluzione, e ha funzionato davvero bene. Molte grazie. – arne

+0

Posso anche confermare questo comportamento, se salvo 'contourf()' con livelli, in PS, EPS, PDF ma non in uscita SVG. Anche l'esecuzione di questo tipo di PS/EPS/PDF tramite GhostScript e l'output, ad esempio PNG a 300 dpi, non mostra alcun problema, ma la visualizzazione di PDF in Acrobat, SumatraPDF (utilizza il motore mupdf, disegnato dalle stesse persone dietro GhostScript), CorelDraw, Ipe, .. tutti mostrano questo artefatto come visibile. – theta

+0

Più dentro, non è che i contorni abbiano contorni, ma c'è un piccolo spazio tra i contorni e lo sfondo bianco della finestra trama è ciò che viene mostrato come contorno del contorno. – theta

Problemi correlati