2013-01-03 11 views
11

In Python matplotlib.fill_between, il seguente esempio di lavoro di seguito riportato viene disegnato correttamente sullo schermo e su .png. Nel risultato .pdf tuttavia, le linee di bordo sono ancora disegnate. Come posso risolvere questo?Perché matplotlib fill_between disegna solo edgelines su un PDF?

from numpy import * 
import pylab as plt 

# Sample data 
X = linspace(0,2*pi,1000) 
Y0 = sin(X) 
Y1 = sin(X+.2) 
Y2 = sin(X+.4) 

# fill_kwargs (what am I missing?) 
fbk = {'lw':0.0, 'edgecolor':None} 

ax = plt.subplot(111) 
ax.fill_between(X, 0, Y0 , facecolor = 'b', **fbk) 
ax.fill_between(X, Y0, Y1, facecolor = 'g', **fbk) 
ax.fill_between(X, Y1, Y2, facecolor = 'r', **fbk) 
plt.xlim(pi-.8,pi+.5) 
plt.ylim(-.5,.5) 

plt.savefig('fA.png') # No edge lines 
plt.savefig('fA.pdf') # Edge lines! 

risultato PNG

enter image description here

risultato PDF

enter image description here

Mentre sembra banale, diventa estremamente problematico quando si pila 200 fill_between trame, tutto quello che vedi è un brutto pasticcio di nero!

risposta

10

Non è perfetto, ma ho trovato una soluzione (e ne accetterò una migliore se verrà). Apparently PostScript potrebbe essere la colpa:

... note that interpreting a linewidth of zero as a 1 pixel wide line is what PostScript does. So the only way to get a true zero width for PostScript output is to fill the polygon without stroking it.

La soluzione è quella di rendere l'edgecolor lo stesso del facecolor. Funziona, ma se il facecolor ha una trasparenza sembra che edgecolor non abbia lo stesso valore di trasparenza.

1

non è abbastanza a tutti, ma se lo si imposta su Nessuno, getterà questo errore:

Traceback (most recent call last): File "/usr/local/lib/python2.7/site-packages/matplotlib/artist.py", line 59, >in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/usr/local/lib/python2.7/site-packages/matplotlib/figure.py", line 1085, >in draw func(*args) File "/usr/local/lib/python2.7/site-packages/matplotlib/artist.py", line 59, > in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/usr/local/lib/python2.7/site-packages/matplotlib/axes/_base.py", line > 2110, in draw a.draw(renderer) File "/usr/local/lib/python2.7/site-packages/matplotlib/artist.py", line 59, > in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/usr/local/lib/python2.7/site-packages/matplotlib/lines.py", line 694, >in draw gc.set_linewidth(self._linewidth) TypeError: a float is required

e continuare a rendere senza la linea. Le trame di violino sovrapposte ora funzionano con Seaborn!

con 0.0 linewidth:

with 0.0 linewidth

con nessuno:

Using None

Problemi correlati