2013-01-03 1 views
11

Pythonのmatplotlib.fill_betweenでは、以下の最小限の作業例が画面と.pngに正しく描画されています。しかし、結果として.pdfでは、エッジラインは引き続き描画されます。これをどうすれば解決できますか?なぜmatplotlib fill_betweenは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! 

PNG結果

enter image description here

PDFの結果、それは些細思えますが、あなたが200のfill_betweenプロットを積み重ねたときに、それは極めて問題となるenter image description here

、あなたが見るすべて黒の醜い混乱です!

答えて

10

これは完璧ではありませんが、私は解決策を見つけました(それが来たらもっと良いものを受け入れます)。 Apparently PostScriptは非難するかもしれません:

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

ソリューションにEdgeColor FaceColorと同じにすることです。これはうまくいきますが、もしfacecolorが透明であれば、edgecolorは同じ透過値を持たないようです。

1

それはかなりすべてではありませんが、あなたがなしに設定している場合は、このエラーがスローされます:

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

をラインなしでレンダリングし続けています。積み重ねられたヴァイオリンのプロットはSeabornと今では動作します!なしで

with 0.0 linewidth

Using None

0.0線幅と

関連する問題