2013-01-03 9 views
11

W python's matplotlib.fill_between poniższy przykład wykonania poniżej prawidłowo rysuje na ekranie i na .png. W wynikowym .pdf linie krawędzi są jednak nadal rysowane. Jak mogę to naprawić?Dlaczego matplotlib fill_between draw edgelines tylko w pliku 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! 

wynik PNG

enter image description here

wynik PDF

enter image description here

Chociaż wydaje się banalne, staje niezwykle problematyczne, gdy stos 200 fill_between działek, wszystko widać jest brzydkim bałaganem czerni!

Odpowiedz

10

To nie jest doskonałe, ale znalazłem rozwiązanie (i zaakceptuję lepsze, jeśli nadejdzie). Apparently dopisek może być winien:

... 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.

Rozwiązaniem jest, aby edgecolor taki sam jak facecolor. To działa, ale jeśli kolor facecolor jest przezroczysty, wydaje się, że edgecolor nie ma tej samej wartości przezroczystości.

1

To nie całkiem w ogóle, ale jeśli go ustawić na None, to rzuci ten błąd:

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

i nadal czynią bez linii. Ułożone w stosy skrzypce działają teraz z Seabornem!

z 0,0 szerokość linii:

with 0.0 linewidth

z Brak:

Using None

Powiązane problemy